【发布时间】:2010-12-10 23:19:20
【问题描述】:
我整天都在扯头发试图解决这个问题......
我有一个在 iPhone 上运行的 Objective-c 客户端,连接到 Java 服务器。 iPhone 正在使用 AES 加密数据,但我无法在服务器上对其进行解密。我正在使用已知的密码和消息(单个字符串)并在 iPhone 上生成字节数组,在 Java 服务器上使用相同的键和消息生成比较字节数组,但字节数组完全不同(因此不能在 Java 端进行解码)。
客户端正在使用具有以下设置的 CommonCrypto 库...
Data 是一个 NSData,其中包含使用 dataUsingEncoding:NSASCIIStringEncoding 的单词“消息”
密钥是NSData,再次使用上述编码保存短语“1234567891123456”。
算法是kCCAlgorithmAES128
选项是kCCOptionsPKCS7Padding(我认为这相当于服务器上的ECB?!)
服务器正在使用以下代码...
byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());
但是 encryptedData 中的数据与 Objective-c 代码中生成的数据不匹配,字节数组完全不同。
谁能看出我做错了什么?我认为设置都是一样的... :(
- 更新 - 根据要求....
好吧,就这样吧……
iPhone 客户端正在加密以下字符串“消息” 它使用密钥“1234567891123456” 它使用“1010101010101010”的初始化向量 它使用 AES128,具有 CBC 模式(据我所知)和 kCCOptionsPKCS7Padding 选项。
加密(base64编码)的结果是UHIYllDFAXl81ZM7OZPAuA==
服务器使用相同的密钥和初始化向量加密相同的字符串。 它使用以下 Cipher.getInstance("AES/CBC/PKCS5Padding");
加密(base64编码)的结果是ALBnFIHysLbvAxjvtNo9vQ==
谢谢。
- 更新 2 - 根据要求...
这是 iPhone 代码....
NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];
NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];
用于加密的 NSData 类别来自这里...
http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/
顺便说一句,我检查了 toencrypt、pass 和 iv 中的字节数组,它们与服务器上的匹配。
【问题讨论】:
-
我已将服务器更改为按照建议使用 ECB,但仍然无法正常工作。顺便说一句,我确实注意到服务器使用 PKCS5 和客户端使用 PKCS7,但是客户端上没有 5 可用,服务器上没有 7 可用,显然它们无论如何都是兼容的。
-
是的,PKCS7 填充与 PKCS5Padding 相同。如果更改为 ECB 不起作用,则 iPhone 可能正在使用 CBC 模式。您需要确定初始化向量并确保服务器使用的是相同的。
-
感谢您的回复。我在客户端和服务器上创建了一个相同的 IV,但仍然无法正常工作。这就是严重缺乏适用于 iPhone 的体面且可靠的 AES 库的地方! :(
-
您能否发布一个纯文本示例以及每个环境中生成的密文?
-
您是否尝试过在客户端使用 AES 算法的其他变体? (即 AES192、AES256)
标签: java objective-c encryption aes