java - AES 加密在 16 个字符后发散

标签 java android encryption aes

在将数据发送到 .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/

相关文章:

java - 如何在 Android 中使用 XPath 编辑属性

android - 使用 ormlite 获取带有原始 sql 的游标

python - 在JavaScript中使用RSA加密并在Python3中解密

ssl - 如何为指向另一个服务器 IP 地址的 A Record 子域设置 SSL 证书

java - 使用外部 TSL 执行 RestTemplate

java - 反转 int 数组,但结果只完成了一半

java - 如何在 JScrollPane 中获取图像的 X 和 Y 位置

android - 为什么 Android Facebook 界面不支持 Fragments?

encryption - 如何在 Openssl 中以十六进制生成输出?

java - 无法将 c3p0 日志记录转至文件