2012-09-01 94 views
1

我有一些問題解密在bash中用openssl加密的文件。以下是我一步一步做的事情。我無法弄清楚它出錯的地方。如何在CLI中加密文件並使用iOS解密?

原始文件(新行結束):

123456 
abcdef 
ghijkl 

生成32個字節長的隨機密碼:

$ openssl rand -hex 32 
fec8950708098e9075e8b4df9a969aa7963c4d820158e965c7848dbfc8ca73ed 

加密的文件:

$ openssl aes-128-ecb -in original.txt -out encrypted.txt 

關於加密的文件:

$ file encrypted.txt 
encrypted.txt: Non-ISO extended-ASCII text, with CR line terminators, with overstriking 
$ cat encrypted.txt 
Salted__??\z?F?z????4G}Q? Y?{ӌ???????b*?? 

代碼來調用解密方法:

NSData *myDataDec = [self aesDecrypt:@"fec8950708098e9075e8b4df9a969aa7963c4d820158e965c7848dbfc8ca73ed" data:myData]; 
NSLog(@"decrypted: %@", [[NSString alloc] initWithData:myDataDec encoding:NSASCIIStringEncoding]); 

方法解密:

- (NSData *)aesDecrypt:(NSString *)key data:(NSData *)data 
{ 

    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    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 = [data length]; 
    //See the doc: For block ciphers, the output size will always be less than or equal to the input size plus the size of one block. //That's why we need to add the size of one block here 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 
    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 
              kCCAlgorithmAES128, 
              kCCOptionPKCS7Padding, 
              keyPtr, 
              kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */,    
              [data bytes], 
              dataLength, /* input */    
              buffer, 
              bufferSize, /* output */    
              &numBytesEncrypted); 
    NSLog(@"cryptStatus: %d", cryptStatus); 
    if (cryptStatus == kCCSuccess) 
    { 
     NSLog(@"aes success"); 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 
    NSLog(@"aes error"); 
    free(buffer); //free the buffer; 
    return nil; 
} 

日誌:

2012-09-01 15:08:51.331 My Project[75582:f803] cryptStatus: -4304 
2012-09-01 15:08:51.332 My Project[75582:f803] aes error 
2012-09-01 15:08:51.332 My Project[75582:f803] decrypted: 

kCCDecodeError細節:

kCCDecodeError - Input data did not decode or decrypt properly. 

回答

0

OpenSSL使用非標準格式。 AESencrypt非常破碎(而且不安全)。把它們放在一起,它不會工作。請參閱RNCryptor瞭解iOS上的OpenSSL兼容解決方案。 OpenSSL本身存在很多問題,但它是我現在可以推薦的最好的命令行選項。

0

在加密文件時,您似乎沒有添加填充。解密時,您似乎期待PKCS7填充。解密方法將自動檢查正確的填充。如果它發現不正確的填充,那麼它會拋出一個錯誤。

添加PKCS7填充到您的加密方法,看看會發生什麼。

另請注意,ECB不是安全模式。首選使用CBC或CTR模式。如果您需要驗證以及加密,請使用GCM模式。

+0

如何添加PKCS7填充到我的加密?我嘗試了用kCCOptionECBMode替換kCCOptionPKCS7Padding,cryptStatus現在是「成功」,但返回的結果沒有正確解密。 – maxagaz

+0

你會得到什麼?如果它是正確的文本,並在最後添加字節,則添加的字節是填充並可以安全地刪除。 – rossum

+0

我得到一個非人類可讀的文本:即使我更改密碼的任何其他內容也總是相同,如果我通過NSASCIIStringEncoding更改NSUTF8StringEncoding,也是如此。 – maxagaz

相關問題