【问题标题】:CCCrypt decryption results in -4304CCCrypt解密结果-4304
【发布时间】:2012-07-11 09:16:22
【问题描述】:

当我加密一个字符串然后立即解密时,CCCryptorStatus 是 -4304 并且生成的解码字符串的长度不正确。谁能看到我可能做错了什么?

//Encrypt

NSString *plainText = @"e22ae25e-0b20-433a-8aa5-a5678714f590";
NSData *rawData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
size_t outLength;
NSMutableData *cipherData = [NSMutableData dataWithLength:rawData.length + kCCBlockSizeAES128];
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [AESKey bytes], [AESKey length],  NULL, [rawData bytes], [rawData length], [cipherData mutableBytes], [cipherData length], &outLength);

//[plainText length] = 36
//[rawData length] = 36
//[cipherData length] = 52
//outLength = 48

//Decrypt

NSMutableData *decodedData = [NSMutableData dataWithLength:cipherData.length + kCCBlockSizeAES128];

//[decodedData length] = 68

CCCryptorStatus cryptStatus2 = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [AESKey bytes], [AESKey length], NULL, [cipherData bytes], [cipherData length], [decodedData mutableBytes], [decodedData length], &outLength);
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];

//[decodedData length] = 68
//[decodedString length] = 68

/*
    At this point, cryptStatus2 is -4304 and 
    decodedString = "e22ae25e-0b20-433a-8aa5-a5678714f590\f\f\f\f\f\f\f\f\f\f\f\f";

*/

【问题讨论】:

  • 查找 CCCryptorStatus 的常量,看看它的含义。
  • kCCDecodeError 输入数据未正确解码或解密

标签: objective-c ios encryption commoncrypto


【解决方案1】:

根据头文件,这是一个kCCAlignmentError。尝试使用outlength 而不是[cipherData length]

【讨论】:

  • 顺便说一句,您的输出缓冲区永远不必大于密文(在 outlength 的第一个值中)。对于 PKCS7Padding,它将是 outlength - 1,但如果您更改(填充)模式,我会保持 outlength。
  • 猫头鹰,我尝试将解密行更改为 CCCryptorStatus cryptStatus2 = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [AESKey bytes], [AESKey length], NULL, [cipherData bytes], outLength, [decodedData mutableBytes], [decodedData length], &outLength); 这导致错误代码 4304 kCCDecodeError Input data did not decode or decrypt properly.
  • 奇怪的是,您自己的尝试似乎确实有效,除了填充。这是因为填充字节没有被“删除”,但 outLength 应该给出纯文本的大小。你能打印出输入/输出的大小,尤其是调用后的 outLength 值吗?你不需要初始化那些变量吗?
  • Owlstead,感谢您对此的帮助。我已经用 cmets 更新了我上面的问题,以在执行期间指示长度值。
  • 能否再试一次,但解密结果使用不同的 outLength 变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2012-05-24
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多