使用CommonCrypto与IV,但总是返回零

我正在使用CommonCrypto CCCryptorCreate来解密邮件。 我正在使用密码和IV,但总是返回零。

如果我使用CCCryptorCreate进行解密,但在RUBY端encryption期间不要使用IV,并且不要在obj-c解密端使用IV,那么解密将非常完美,我可以看到该消息。

但是,如果我在obj-c上使用RUBY和IV上的IV,解密以一个零消息对象结束。

我在使用任何东西在Ruby中的Objective-C / Decrypt中使用此encryption

OBJ-C方法:

- (NSData *) decryptedDataUsingAlgorithm: (CCAlgorithm) algorithm key: (id) key // data or string initializationVector: (id) iv // data or string options: (CCOptions) options error: (CCCryptorStatus *) error { CCCryptorRef cryptor = NULL; CCCryptorStatus status = kCCSuccess; NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]); NSParameterAssert(iv == nil || [iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]); NSMutableData * keyData, * ivData; if ( [key isKindOfClass: [NSData class]] ) keyData = (NSMutableData *) [key mutableCopy]; else keyData = [[key dataUsingEncoding: NSUTF8StringEncoding] mutableCopy]; if ( [iv isKindOfClass: [NSString class]] ) ivData = [[iv dataUsingEncoding: NSUTF8StringEncoding] mutableCopy]; else ivData = (NSMutableData *) [iv mutableCopy]; // data or nil #if !__has_feature(objc_arc) [keyData autorelease]; [ivData autorelease]; #endif // ensure correct lengths for key and iv data, based on algorithms FixKeyLengths( algorithm, keyData, ivData ); status = CCCryptorCreate( kCCDecrypt, algorithm, options, [keyData bytes], [keyData length], [ivData bytes], &cryptor ); if ( status != kCCSuccess ) { if ( error != NULL ) *error = status; return ( nil ); } NSData * result = [self _runCryptor: cryptor result: &status]; if ( (result == nil) && (error != NULL) ) *error = status; CCCryptorRelease( cryptor ); return ( result ); } === DOES NOT WORK ==== NSData * result = [self decryptedDataUsingAlgorithm: kCCAlgorithmAES128 key: [[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] initializationVector: [anIV dataUsingEncoding:NSUTF8StringEncoding] options: kCCOptionPKCS7Padding error: &status]; === DOES WORK === NSData * result = [self decryptedDataUsingAlgorithm: kCCAlgorithmAES128 key: [[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] initializationVector: nil options: kCCOptionPKCS7Padding error: &status]; 

看起来像iv可能是不同的,确保数据字节是相同的,长度是正确的。

您希望CCCrypt执行一次性encryption。

来自苹果: CCCrypt是一种无状态,一次性encryption或解密操作。 这基本上执行一系列的CCCrytorCreate()CCCryptorUpdate()CCCryptorFinal()CCCryptorRelease()

既然你不使用CCCrypt那么你将不得不至less把CCCryptorFinal()添加到你的例子中。

还要注意,key和iv真的需要以字节为单位正确的大小。 如果某些字符需要多个字节编码,则使用NSUTF8StringEncoding可能不会产生预期的字节数。 注意:“我”可以编码为代理对。

不要使用密码string而不使用PBKDF2来生成一个好密钥。

考虑使用RNCryptor,除非你真的知道你在做什么encryption。

这里是一次性encryption/解密方法的简单示例代码
钥匙和iv必须是正确的长度。
任何编码(Base64,NSString等)都是在这个方法之外完成的。

 + (NSData *)doCipher:(NSData *)dataIn iv:(NSData *)iv key:(NSData *)symmetricKey context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt error:(NSError **)error { CCCryptorStatus ccStatus = kCCSuccess; size_t cryptBytes = 0; NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; ccStatus = CCCrypt( encryptOrDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, symmetricKey.bytes, kCCKeySizeAES128, iv.bytes, dataIn.bytes, dataIn.length, dataOut.mutableBytes, dataOut.length, &cryptBytes); if (ccStatus == kCCSuccess) { dataOut.length = cryptBytes; } else { if (error) { *error = [NSError errorWithDomain:@"kEncryptionError" code:ccStatus userInfo:nil]; } dataOut = nil; } return dataOut; }