我一整天都在绞尽脑汁想解决这个问题...
我有一个在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中的字节数组,它们与服务器上的字节数组相匹配。
发布于 2009-10-29 02:07:10
这不是我的领域,但看起来在客户机上有PKCS7
,但在服务器上有PKCS5
。
发布于 2011-10-25 23:54:37
我刚刚遇到了完全相同的问题。我在iOS客户端上使用CommonCrypto,使用以下设置:
NSData * encrypted = [data dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
服务器使用与客户端具有相同密钥和初始化向量的Cipher.getInstance("AES/CBC/PKCS5Padding");
。
在用头撞墙了几个小时后,我终于听从了杰森的建议,检查了dataEncryptedUsingAlgorithm
例程,并在FixKeyLengths
之后立即打印出了keyData
。原来我的128位密钥扩展到了192位,最后加上了0。修复这个问题后,一切都会正常工作。:)
更新:我的答案发布在大约2年前,这个问题似乎在最新的NSData+CommonCrypto代码中得到了修复。具体地说,这是导致问题的部分:
static void FixKeyLengths( CCAlgorithm algorithm, NSMutableData * keyData, NSMutableData * ivData )
{
NSUInteger keyLength = [keyData length];
switch ( algorithm )
{
case kCCAlgorithmAES128:
{
if ( keyLength <= 16 )
{
[keyData setLength: 16];
}
else if ( keyLength <= 24 )
{
[keyData setLength: 24];
}
else
{
[keyData setLength: 32];
}
break;
}
第一个检查keyLength <= 16
之前并不在那里。
如果你现在还在遇到问题,那可能是别的原因。
发布于 2009-10-29 02:23:49
iPhone与AES一起使用的模式是什么?您没有列出任何内容,所以这可能意味着它没有使用链接(ECB)。
然而,在Java端,您使用的是CBC,但没有指定初始化向量。这绝对是错误的。如果你真的在使用CBC,你必须有加密过程中使用的IV。IV不是秘密的;它可以与密文一起发送。
如果您真的在使用ECB,则没有IV,但是您的Java指定了错误的模式。
https://stackoverflow.com/questions/1638971
复制相似问题