我一整天都在绞尽脑汁想解决这个问题...
我有一个在iPhone上运行的objective-c客户机,它连接到一个Java服务器。iPhone正在使用AES加密数据,但我无法在服务器上解密它。我使用已知的密码和消息(单字符串),并在iPhone上生成字节数组,在Java服务器上使用相同的键和消息生成一个比较字节数组,但是字节数组完全不同(因此在Java端无法解码)。
客户端正在使用具有以下设置的CommonCrypto库...
Data是保存单词"message“的NSData
,使用dataUsingEncoding:NSASCIIStringEncoding
Key是保存短语"1234567891123456”的NSData
,再次使用如上的编码。Algorithm is ECB Options is kCCOptionsPKCS7Padding
(我相信这等同于服务器上的kCCAlgorithmAES128
?!)
服务器正在使用以下代码...
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==
谢谢。
这是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/
顺便说一下,我检查了加密、传递和iv中的字节数组,它们与服务器上的字节数组相匹配。
https://stackoverflow.com/questions/1638971
复制相似问题