【发布时间】:2011-12-06 18:33:30
【问题描述】:
我只是在 iPhone 上使用 CCrypt 编写基本的“加密”和“解密”方法。
我一直在运行一些测试,我真的很惊讶地发现,有时,如果您尝试使用与用于加密纯文本的密钥不同的密钥来解密加密文本,CCrypt 不会返回任何错误。
这是一个例子:
- (void) testDecryptTextWithTheWrongKey {
NSData *encryptKey = [Base64 decodeBase64WithString:@"+LtNYThpgIlQs2CaL00R6AuG2C/i6U1Vt1+6wfFeFMk="];
NSData *decryptKey = [Base64 decodeBase64WithString:@"yg7BvhM8npVGpAFpAESDn3IRWpe6qeQWaa1rwHiTsyU="];
NSString *plainText = @"The text to be encrypted";
NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSData *encrypted = [LocalCrypto encryptText:plainTextData key:encryptKey error:&error];
assertThat(error, nilValue());
assertThat(encrypted, notNilValue());
error = nil;
NSData *decrypted = [LocalCrypto decryptText:encrypted key:decryptKey error:&error];
assertThat(error, notNilValue());
assertThat(decrypted, nilValue());
}
我在 LocalCrypto 中定义的加密和解密方法只是调用了一个内部“executeCryptoOperation”方法,表明他们想要加密或解密:
+ (NSData *) executeCryptoOperation:(CCOperation)op key:(NSData *) key input:(NSData *) input error:(NSError **)error {
size_t outLength;
NSMutableData *output = [NSMutableData dataWithLength:input.length + kCCBlockSizeAES128];
CCCryptorStatus result = CCCrypt(op, // operation
kCCAlgorithmAES128, // Algorithm
kCCOptionPKCS7Padding | kCCOptionECBMode, // options
key.bytes, // key
key.length, // keylength
nil, // iv
input.bytes, // dataIn
input.length, // dataInLength,
output.mutableBytes, // dataOut
output.length, // dataOutAvailable
&outLength); // dataOutMoved
if (result == kCCSuccess) {
output.length = outLength;
} else {
*error = [NSError errorWithDomain:kCryptoErrorDomain code:result userInfo:nil];
return nil;
}
return output;
}
好吧,我的问题是:当我们尝试使用与加密期间使用的密钥不同的密钥解密加密文本时,CCrypt 返回 kCCSuccess 是否正常?我错过了什么或做错了什么?
确实,即使 CCrypt 返回解密成功,我也无法从结果数据中获得正确的 NSString,但我当然希望 CCrypt 在这种情况下返回某种错误(Java 可能会这样做) )。
如果这是正常行为,我应该如何知道解密操作返回的是真正的纯文本还是只是一堆没有任何意义的字节?
这里有一个类似的问题,但答案并不能真正说服我:Returning wrong decryption text when using invalid key
谢谢!
【问题讨论】:
-
链接问题中的答案非常有意义。只要你的密钥符合要求,就用来解密加密的字符串,没有出现错误。它应该如何以及为什么要知道解密后的文本应该是什么样子?
-
我明白你的意思,它确实有道理。让我感到困惑的是,如果我在 Java 中运行相同的测试(用一个密钥加密并用另一个密钥解密),我在解密过程中会遇到异常(更具体的是 BadPaddingException)......关于原因的任何想法Java“检测到”出现了问题而 iOS 没有?
标签: iphone objective-c cocoa encryption aes