使用AES进行数据加密

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

要加密的字符串:“The quick brown fox jumped over the lazy dog”。 密码:“12345678901234561234567890123456”

结果为:

<7eda336b 82f3e279 ae7638fe cccfffc6 5fbef8da 6df76d97 67d8cfa8 5bce2ae9>

我的代码:
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工具:

相同的字符串和密码

结果:

<7eda336b 82f3e279 ae7638fe cccfffc6 5fbef8da 6df76d97 67d8cfa8 5bce2ae9 ca2ed34a 48f85af2 909654d5 b0de0fb7>

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

有什么建议吗? 谢谢

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


我正在使用NSData+CommonCrypto.h中的AES256EncryptedDataUsingKey:error:error;方法。 - YYfim
self.strnToBeEnc = @"快速的棕色狐狸跳过了懒惰的狗"; self.appKey = @"12345678901234561234567890123456"; NSData *data2 = [self.strnToBeEnc dataUsingEncoding:NSASCIIStringEncoding]; NSLog(@"%@", data2); NSData *s2 = [data2 AES256EncryptedDataUsingKey:self.appKey error:nil]; NSLog(@"%@", s2); - YYfim
只需创建字符串,将其转换为数据,加密数据并NSLog结果。 - YYfim
只是出于好奇,我看到网络上的每个人都使用NSUTF8StringEncoding而不是NSASCIIStringEncoding。那会给你什么? - trumpetlicks
只是想检查一下,它是否会改变,没有任何额外的输出,它会产生相同的结果。 - YYfim
显示剩余2条评论
1个回答

2
我知道你想避免这个问题,但我认为你可能需要花些时间在AESCrypt-Objc的源代码中,因为我怀疑它在某种程度上没有加密最后一个块。
进入代码并查看是否实际到达CCCryptorFinal调用,并注意其结果。这可以在AESCrypt-ObjC/NSData+CommonCrypto.m_runCryptor:result:中找到。另一个要考虑的事情是他们正在使用的默认填充类型,似乎是kCCOptionPKCS7Padding,这也会影响到你的结束字节。
首先使用非任意长度的字节进行测试,这些字节是AES块大小的倍数,然后一旦验证了这一点,再转向此处的可变长度字节。

嘿,dtrotzjr, 我在算法(在_runCrypto:result:中)中进行了逐步操作,唯一找到的异常是在CCCryptorFinal方法中,其中bufused变量获得值为0。另外,当使用“kCCOptionECBMode | kCCOptionPKCS7Padding”而不仅仅是“kCCOptionPKCS7Padding”时,我已经成功获取了输出的正确字节大小,但最后16个字节与测试工具中的结果不相等。 新结果:<7eda336b 82f3e279 ae7638fe cccfffc6 5fbef8da 6df76d97 67d8cfa8 5bce2ae9 650c76c7 ea3ca6c6 5d3c90b2 34e86c63> - YYfim
1
如果你想验证AES,你需要了解AES,花些时间阅读关于AES的资料并理解所有这些变量(块链模式、填充等)的含义,然后找出AESCrypt-Objc使用的确切参数以及你的AES加密测试使用的参数,并确保它们都相同。然后从一个AES单块大小的数据开始,然后逐渐增加数据大小,直到数据大小是块大小的倍数,然后使用任意长度的数据。否则,你会疯狂地尝试弄清楚问题出在哪里。 - dtrotzjr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接