Как я могу сделать зашифрованную строку xcode так же, как зашифрованную строку в Java - PullRequest
1 голос
/ 08 сентября 2011

Я новичок в xcode. Я шифрую строку в xcode, а также шифрую ту же строку в Java, используя AES 256 bit, и вижу некоторые странные проблемы. Шифрование в Java и Iphone не совпадают, я использовал следующий код:

NSString *password = @"mypassword";
NSString *str = @"message"; 
NSLog(@"encrypting string =%@",str);
NSData *data = [str dataUsingEncoding: NSASCIIStringEncoding];
NSData *encryptedData = [data AES256EncryptWithKey:password];
NSString *responseString = [[NSString alloc] initWithData:encryptedData encoding:NSASCIIStringEncoding];
[Base64 initialize];
NSString *b64EncStr = [Base64 encode:encryptedData];

NSLog(@"Base 64 encoded = %@",b64EncStr);
NSData  *b64DecData = [Base64 decode:b64EncStr];
NSData *decryptedData = [b64DecData AES256DecryptWithKey:password];
NSString* decryptedStr = [[NSString alloc] initWithData:decryptedData encoding:NSASCIIStringEncoding];
NSLog(@"decrypted string = %@",decryptedStr);

 /////////////////************///////////////***************************/////////////////////

 - (NSData *)AES256EncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256 + 1]; 
bzero( keyPtr, sizeof( keyPtr ) ); 
 [key getCString:keyPtr maxLength:sizeof( keyPtr )
 encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                           keyPtr, kCCKeySizeAES256,
                                           NULL ,
                                           [self bytes], dataLength, 
                                           buffer, bufferSize, 
                                           &numBytesEncrypted );
    if( cryptStatus == kCCSuccess )    {
       return [NSData dataWithBytesNoCopy:buffer
 length:numBytesEncrypted];    }

    >free( buffer ); 
    >return nil; }




- (NSData *)AES256DecryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1]; 
bzero( keyPtr, sizeof( keyPtr ) ); 
[key getCString:keyPtr maxLength:sizeof( keyPtr )
 encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
 size_t numBytesDecrypted = 0;
 CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt,
 kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                           keyPtr, kCCKeySizeAES256,
                                           NULL ,
                                           [self bytes], dataLength, 
                                           buffer, bufferSize, 
                                           &numBytesDecrypted );

    if( cryptStatus == kCCSuccess )    {
       return [NSData dataWithBytesNoCopy:buffer
 length:numBytesDecrypted];    }

 free( buffer ); 
 return nil; }

я получаю зашифрованную строку nd1+bWMbk+BEnr9uPIq2eQ== в xcode

но в Java, используя следующий код, я шифрую его

SecretKeySpec spec = getKeySpec();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, spec);
BASE64Encoder enc = new BASE64Encoder();
String hexString = stringToHex(text);
>return enc.encode(cipher.doFinal(hex2byte(hexString)));

и зашифрованная строка: mCP+z7ZqxDWPoJPaPoVfSw== Я не могу найти идеальное решение в Java?

1 Ответ

1 голос
/ 08 сентября 2011

Я добавил тег шифрования.Вы должны быть уверены, что обе стороны одинаковы.Обе стороны должны использовать AES-256 в одном и том же режиме (использовать режим CBC) с одним и тем же ключом, одним и тем же IV (вам может понадобиться передать его) и одним и тем же отступом (используйте PKCS7).

Если выполагайтесь на значения по умолчанию, тогда вы обнаружите, что значения по умолчанию различаются в зависимости от того, какие результаты вы получите.

Вы также используете текстовые строки.Кроме того, вам необходимо убедиться, что обе стороны используют одинаковую кодировку текста, предпочтительно UTF-8.Может быть проще сначала проверить вещи с помощью байтовых массивов, чтобы устранить возможные проблемы с обработкой текста.Вы всегда можете добавить текст позже, если вы правильно настроили байтовые массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...