在将数据发送到 .NET 服务器之前,我使用 AES 算法对我的 iPhone 和 Android 应用程序中的数据进行加密。
iPhone 加密工作正常(.NET 服务器代码解密没问题)。
Android 加密适用于 < 16 个字符的明文字符串。对于 >= 16 个字符的明文字符串,第一个加密“ block ”与 iPhone 相同,第二个加密 block 完全不同。我的 key 长度是 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 个字符后发散)。
最佳答案
很可能您使用的密码模式不正确。而且,最有可能的是,您应该使用 CBC 而不是 ECB。 而且,由于 CBC 需要 IV(初始 vector ),并且不同的加密方案可以使用不同的默认 vector ,所以它从第一次尝试开始就不起作用。
关于java - AES 加密在 16 个字符后发散,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108317/