2013-10-17 67 views
0

我想解密使用AES 256 CFB模式在Python中加密的文件。AES加密interopbility IOS和Python

當我嘗試在IOS中解密它時,它不能解密它。給一些垃圾串。

NSString * AES_Decrypt(NSString * key, NSString * cipherText,NSString *iv) 
{ 
    @autoreleasepool { 
    NSMutableData * mutableCipher = [[NSMutableData alloc] init]; 
    mutableCipher = (NSMutableData *)[cipherText dataUsingEncoding:NSUTF8StringEncoding]; 
    char keyPtr[kCCKeySizeAES256+1]; 
    bzero(keyPtr, sizeof(keyPtr)); 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding]; 
    uint8_t iv[kCCKeySizeAES128+1]; 
    bzero((void *) iv, (size_t) sizeof(iv));  
    size_t numBytesEncrypted = 0;  
    NSUInteger dataLength = [mutableCipher length]; 
    size_t bufferSize = dataLength + kCCKeySizeAES128;  
    void *buffer_decrypt = malloc(bufferSize);   
    NSMutableData * output_decrypt = [[NSMutableData alloc] init];   
    CCCryptorStatus result = CCCrypt(kCCDecrypt , kCCAlgorithmAES128, kCCModeCFB, keyPtr, kCCKeySizeAES128, iv, [mutableCipher mutableBytes] , [mutableCipher length], buffer_decrypt, bufferSize, &numBytesEncrypted);  
    output_decrypt = [NSMutableData dataWithBytesNoCopy:buffer_decrypt length:numBytesEncrypted]; 
    NSString * decryptedStr = [[NSString alloc] initWithData:output_decrypt encoding:NSASCIIStringEncoding]; 
    NSLog(@"Decrypted String is::%@",decryptedStr); 
    if(result == kCCSuccess){ 
     return decryptedStr; 
    } 
    else{ 
     return NULL; 
    } 

} 
return NULL; 
} 

我用下面的參數調用它。

AES_Decrypt(@"d5a75c3377fbd50a24ae372c787d598b633e82f4210f90dfc8e618c47811d812", @"」l*®*ŸÂ€­Û»†.Sì’±—ë", @"3d396f81a3443ca44ce146c91a81d3d8"); 

但該方法的輸出沒有返回預期的輸出。誰能幫我這個。

回答

1

這樣不能將任意數據編碼爲NSString。並非每個數據序列都是合法的UTF8字符串。

您錯誤地傳遞了您的密鑰。您傳遞的密鑰是512位長(64字節大小的字符)。你抓住了前256位,但這些位幾乎肯定不是你想要傳遞的關鍵(看起來你的關鍵是以十六進制格式;但是你不會解碼十六進制)。

你忽略了傳給你的IV,而只是使用由零組成的IV。

最後,您將數據轉換爲ASCII字符串,但ASCII無法編碼任意數據字符串。

除了調用CCCrypt()以外,還有更多的加密。如果你想要一個可以用Cocoa和Python實現的加密庫,請參閱RNCryptor。我知道這並不是如何正確編寫這段代碼的完整答案,但是正確的加密實際上是一個相當複雜的話題,你應該避免從頭開始編寫代碼。正如你在這裏看到的,它是非常複雜的容易做錯誤的事情很多,而且很小的錯誤可能會完全破壞你的安全性,我在編寫RNCryptor時一直非常小心,爲了解決安全性錯誤,我仍然不得不多次修改它,所以我強烈建議使用高而不是嘗試使用像CommonCryptor這樣的低級組件來構建加密解決方案。)

0

你確定python加密輸出的是UTF-8編碼的字符串嗎?

+0

我們已經嘗試過在這裏使用ASCII。 mutableCipher =(NSMutableData *)[cipherText dataUsingEncoding:NSUTF8StringEncoding]; – user2414445