【问题标题】:Data encryption with AES使用 AES 加密数据
【发布时间】:2014-05-08 08:47:15
【问题描述】:

我正在构建一个将与服务器 (php) 通信的应用程序,并且我想加密这种通信(可能会使用 json)。经过大量搜索和阅读,我找到了AESCrypt-Objc 项目。 在测试加密时(我正在使用网络工具AES Encryption test),我发现在加密结果中我丢失了 16 个字节的数据。 这是我正在使用的示例 在 AES 项目中:

要加密的字符串:“敏捷的棕狐跳过了懒狗”。 密码:“12345678901234561234567890123456”

结果:

我的代码:

self.strnToBeEnc = @"The quick brown fox jumped over the lazy dog";
self.appKey      = @"12345678901234561234567890123456";
NSData *data2    = [self.strnToBeEnc dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", data2); 
NSData *s2 = [data2 AES256EncryptedDataUsingKey:self.appKey error:nil]; 
NSLog(@"%@", s2);

WEB工具:

相同的字符串和密码

结果:

如您所见,我缺少一些字节...:) 我尝试在算法中添加缓冲区,但没有成功。

有什么建议吗? 谢谢

(如果问题不够详细,请告诉我)

【问题讨论】:

  • 你用的是什么代码,或者你试过了吗?看起来好像您没有加密数据的最后 128 位块,或者根本不显示它。输入为 352 位,这意味着使用填充后,您的输出应不少于 3 x 128 位 AES 块长!
  • 我正在使用 AES256EncryptedDataUsingKey:error:error; NSData+CommonCrypto.h 中的方法
  • self.strnToBeEnc = @"敏捷的棕狐跳过了懒狗"; self.appKey = @"12345678901234561234567890123456"; NSData *data2 = [self.strnToBeEnc dataUsingEncoding:NSASCIIStringEncoding]; NSLog(@"%@", data2); NSData *s2 = [data2 AES256EncryptedDataUsingKey:self.appKey error:nil]; NSLog(@"%@", s2);
  • 只是创建字符串,转换为数据,加密数据,然后 NSLog 结果
  • 出于好奇,我看到网络上的每个人都使用NSUTF8StringEncoding 而不是NSASCIIStringEncoding。这给了你什么?

标签: ios objective-c encryption aes commoncrypto


【解决方案1】:

我知道你试图避免这种情况,但我认为你可能需要花一些时间在 AESCrypt-Objc 的源代码中,因为我怀疑它以某种方式没有加密最后一个块。

进入代码,看看你是否真的调用了CCCryptorFinal,并记下它的结果。这可以在 AESCrypt-ObjC/NSData+CommonCrypto.m _runCryptor:result: 中找到。要研究的另一件事是他们使用的默认填充类型似乎是kCCOptionPKCS7Padding,这也会对您的结束字节产生影响。

首先使用 AES 块大小的倍数的非任意长度字节进行测试,然后在验证后继续使用此处的可变长度字节。

【讨论】:

  • 嘿 dtrotzjr,我在算法中一步一步地做了(在 _runCrypto:result: 中),我能发现的唯一不寻常的是在 CCCryptorFinal 方法中,其中 bufused 变量的值是:0,我设法在输出中获得正确的字节大小的另一件事(使用'kCCOptionECBMode | kCCOptionPKCS7Padding' 而不仅仅是'kCCOptionPKCS7Padding')但最后16个字节不等于测试工具中的结果。新结果:
  • 如果您想验证 AES,您需要了解 AES,花一些时间阅读 AES 并了解所有这些变量(块链模式、填充等)的含义,然后弄清楚 @ 到底是什么意思987654326@ 使用和您的 AES 加密测试使用什么,并确保所有参数都相同。然后从 AES 单个块大小的数据大小开始,然后向上移动到块大小的倍数的数据大小,然后使用任意长度的数据。否则你会发疯地试图找出问题所在。