我已经整天都在苦苦寻找解决方法了...
我有一个运行在iPhone上的Objective-C客户端,连接到一个Java服务器。iPhone正在使用AES加密数据,但是我无法在服务器上解密它。我正在使用已知的口令和消息(单个字符串),在iPhone上生成byte数组,在Java服务器上使用相同的键和消息生成比较的byte数组,但是byte数组完全不同(因此无法在Java端解码)。
客户端使用CommonCrypto库并使用以下设置...
数据是一个包含单词"message"的NSData
,使用dataUsingEncoding:NSASCIIStringEncoding
进行编码。
键是一个包含短语"1234567891123456"的NSData
,同样使用上述编码。
算法为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客户端正在加密以下字符串“message” 它使用密钥“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字节数组,它们与服务器上的匹配。