【发布时间】:2015-12-21 19:26:38
【问题描述】:
我们需要编写一些 Android 代码来解密从我们的服务器发送的一些数据。我们的服务器团队为我们提供了一些使用“SunJCE”提供程序的示例解密代码,不幸的是,Android 上不存在该提供程序。
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
有人知道在 Android 上实现此功能的最简洁方法吗?如果我们在 Android 上试试这个
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
然后看起来在解密文本的末尾出现了一些不需要的垃圾,例如:
ComparisonFailure: expected:<...lAAAAABJRU5ErkJggg==[]> but was:<...lAAAAABJRU5ErkJggg==[��������]>
我们在 Android Cipher 类中尝试了多种不同转换的组合(例如“AES/CBC/PKCS5Padding”),但不断遇到诸如 BadPaddingExceptions 之类的问题。
我们还能够使用纯 Java 模块解密这些数据,该模块似乎没有显示相同的垃圾字符。有没有办法只使用 Android 类来做到这一点?
【问题讨论】:
-
你能打印出十六进制的明文值(使用 NoPadding)吗? Bouncy Castle 和 Apache Commons Codec(以及 Guava 等)具有十六进制编码器。
-
我的情况与“简单的 java AES 加密/解密示例”问题有点不同,因为我们的 Android 客户端只是解密,而不是加密。我们可以在 Android 上很好地加密和解密(以及在测试做同样事情的纯 Java 独立项目时),但是在解密在 Java JVM 上加密的数据时,我们最终会在 Android 上得到垃圾。我相信最后的垃圾字节都是零。我的加密数据在 Java 字符串中定义,解密后的预期明文也是如此(取自示例 Java-only 项目)。
标签: java android encryption cryptography aes