gpt4 book ai didi

android - AES/CFB/PKCS5Padding 在不同的 Android 版本上表现不同

转载 作者:行者123 更新时间:2023-11-29 19:34:28 24 4
gpt4 key购买 nike

我有这个加密功能:

String Encrypt(String text, byte[] keyBytes) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec("AAAAAAAAAAAAAAAA".getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
return Base64.encodeToString(results, Base64.URL_SAFE);
}

在大多数 Android 设备上,它都能正常工作。但是,在某些旧设备(Note 3、LG G2、Android 4.4)上,它没有按应有的方式加密。

这是两个设备之间的比较。 note3加密错误,Nexus 6正常。

Note 3
---------
String to encrypt: Hello, world
Encryption key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
Encryption result bytes: [108, -63, -66, 117, 62, -78, -108, 22, 12, -128, 119, 22]
Encryption result Base64: bMG-dT6ylBYMgHcW

Nexus 6
---------
String to encrypt: Hello, world
Encryption key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
Encryption result bytes: [108, -63, -66, 117, 62, -78, -108, 22, 12, -128, 119, 22, 89, -73, -23, 114]
Encryption result Base64: bMG-dT6ylBYMgHcWWbfpcg==

这是一个已知错误吗?我可以做些什么来解决这个问题?

最佳答案

CFB mode of operation是一种流模式,这意味着它不需要填充。因此,旧版本似乎只是忽略了您对 PKCS#7 填充的请求(与 PKCS#5 填充相同)。

你有两个选择:

  • Cipher.getInstance("AES/CFB/PKCS5Padding") 更改为 Cipher.getInstance("AES/CFB/NoPadding") 以便所有版本都生成缩短的输出。
  • 如果您确实需要该填充,您可以使用 Cipher.getInstance("AES/CFB/NoPadding") 并在加密前手动添加填充并在解密后将其删除。所有padding bytes有一个值表示有多少填充字节。

当然,如果你已经有了一个版本,你真的不应该改变任何东西,因为这只会给使用“行为不当”设备的用户带来错误。

关于android - AES/CFB/PKCS5Padding 在不同的 Android 版本上表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com