我正在使用AES算法加密我的iPhone和Android应用程序上的数据,然后再将其发送到.NET服务器。
iPhone加密工作正常(.NET服务器代码解密它没问题)。
Android加密适用于明文字符串< 16个字符。对于明文字符串> = 16个字符,第一个加密的“块”与iPhone相同,第二个加密的块完全不同。我的密钥长度是16个字符。
这是Android代码(最多16个字符可以正常工作):
byte[] valueData = value.getBytes();
byte[] keyData = skey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(keyData, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] valueEncryptedData = cipher.doFinal(valueData);
String valueEncryptedString = Base64.encodeToString(valueEncryptedData, Base64.DEFAULT);
return valueEncryptedString;
这是我的iOS代码,工作正常:
StringEncryption *crypto = [[StringEncryption alloc] init];
CCOptions padding = kCCOptionPKCS7Padding;
NSData *valueData = [value dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [skey dataUsingEncoding:NSUTF8StringEncoding];
NSData *valueEncryptedData = [crypto encrypt:valueData key:keyData padding:&padding];
NSString *valueEncryptedString = [valueEncryptedData base64EncodingWithLineLength:0];
我怀疑问题是微不足道的。例如。也许我正在使用错误的Cipher初始化,我应该使用CBC而不是ECB。但是,使用Cipher.getInstance("AES/CBC/PKCS7PADDING")
的输出也不会产生预期的结果(事实上,更糟糕的是,加密值与iPhone加密值完全不同,而不仅仅是在前16个字符之后发散)。
答案 0 :(得分:2)
您很可能使用了错误的密码模式。并且,最有可能的是,您应该使用CBC而不是ECB。 并且,由于CBC需要IV(初始向量),因此第一次尝试不起作用,并且不同的加密方案可以使用不同的默认向量。