2012-04-05 55 views
1

我正在使用CCCrypt進行加密/解密字符串值。它似乎工作正常,因爲解密值等於初始值,但問題是我無法從解密數據中提取正確的NSString對象。CCCrypt加密結果問題

@implementation NSData (AES256) 

- (NSData *)AES256EncryptWithKey:(NSString *)key 
{ 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [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 /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [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 /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

我不能得到什麼是做錯了,所以如果任何人都可以幫助,我會高度讚賞。

問題的第二部分 - 我如何設置AES加密方法的CBC模式。據說在文檔中默認使用了這種模式,但是我應該如何通過CCCrypt方法中的第三個參數?

回答

1

對於您在上一個答案中評論過的問題,initWithData:encoding:函數將返回nil,因爲加密的數據與NSUTF8StringEncoding的加密數據非常不匹配。

同樣的問題與徹底的答案:Why does my initWithData return nil indicating an error after converting NSData to NSString returning from encrypting via CommonCrypto?雖然作爲一邊,base64不會使您的加密數據一個可見的字符串,而是改變它進一步製作一個可顯示的ASCII字符串。這個字符串不應該被假定爲與加密數據相同,也不能與加密數據相同,但是作爲字符串使用,例如在鑰匙串中,它的工作原理很好。

+0

感謝您證明我的建議! :) – Solomiya 2012-05-26 08:51:37

0

要解密後,你必須base64解碼Decrypted Data,然後使用NSUTF8StringEncoding創建NSString。

NSString decryptedString = [[NSString alloc]initWithData:decryptedData]; 

    NSData *data = [NSData dataByBase64DecodingString:decryptedString]; 

    decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding]; 

decryptedString在加密之前保持字符串一樣。

對於base64解碼請參閱this後。

+0

解密後的字符串與應該的完全相同。問題是我看不到像字符串加密的數據 - 當我做'NSString * encryptedString = [[NSString分配] initWithData:encryptedData編碼:NSUTF8StringEncoding];'和打印那些'encryptedString'我得到'(空) 。還是不是我不應該查看加密數據或類似的東西? – Solomiya 2012-04-06 07:29:26