2011-09-08 89 views
1

我是xcode中的新成員。我正在加密xcode中的字符串,並使用AES 256位加密Java中的相同字符串,並且看到一些奇怪的問題。在Java和iPhone的加密不相互匹配我用下面的代碼:我如何使xcode加密的字符串與java中的加密字符串相同

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; } 

我用下面的代碼我正在對它進行加密

在Xcode

但在Java中得到一個加密的字符串nd1+bWMbk+BEnr9uPIq2eQ==

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中找到完美的解決方案嗎?

+0

請編輯您的文章並使用「代碼示例」按鈕而不是「bockquote」按鈕來格式化您的代碼。這是不可讀的。 –

回答

1

我已經添加了加密標籤。你需要確定雙方都是一樣的。雙方必須以相同的密鑰,相同的IV(您可能需要傳遞它)和相同的填充(使用PKCS7)在相同模式(使用CBC模式)下使用AES-256。

如果你依靠默認值,那麼你會發現默認值不同,你會得到不同的結果。

您也在使用文本字符串。您還需要確保雙方都使用相同的文本編碼,最好是UTF-8。首先使用字節數組檢查事情可能更容易,以消除文本處理中可能出現的問題。一旦你的字節數組正常工作,你總是可以在後面添加文本。