Java 加密 API 与不同平台

标签 java interop cryptography

我有一个 Android 应用程序,它使用 javax.crypto 来加密文件中的一些文本数据。加密实现类似于this .该应用程序可以很好地处理它之前创建的加密数据。

现在,我几乎将我的 Android 应用程序移植到桌面 (JFace/SWT)。我对移植的应用程序使用相同的加密实现,因为它不依赖于任何特定于 Android 的 API。移植的应用程序可以很好地处理它创建的加密数据。

问题是桌面应用程序无法解密与 Android 应用程序一起保存的数据。 Android 应用程序无法解密数据,该数据也与桌面应用程序一起保存。我仔细检查了纯数据的字节流和密码以在两个平台上加密。它们是相同的,因此不存在文本编码等方面的问题。但是加密例程在不同平台上返回不同的加密结果,即使输入数据是逐字节相同的。

Java crypto API 是否保证在不同平台上运行相同?加密提供程序(在我的例子中是 AES/128 位)是否应该在 Android、Linux 和 Windows 上以相同的方式工作?有没有办法调整 javax.crypto 以获得不同平台上的互操作性?

最佳答案

AES-128 应该在两个系统上工作相同。理论上。

在实践中,有很多细节需要在两个系统上保持一致。

  • 您是否在两侧使用了相同的填充?
  • 双方是否使用相同的模式(CBC、CTR、ECB)?
  • 双方的密码是否完全相同?
  • 双方的 IV/Nonce 是否相同?
  • 双方的 key 推导方式是否相同?

检查两个系统上的任何默认值。如果默认值不匹配,则您需要明确设置一侧或另一侧。

关于Java 加密 API 与不同平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719996/

相关文章:

java - 网络代码有时会抛出 UnknownHostException

c# - 在 C# 程序中使用 C++ 常量

java - 解密 AES/CBC/PKCS5Padding 错误 : Given final block not properly padded

java - Jython 中的随机性

Java - 将管道分隔文本\csv 文件转换为 XML

java - 在 Spring Boot 应用程序中使用 Mockito

c# - 如何将数字写入文件并使其在 Java 和 C# 之间可读

c# - 将 VB6 类型转换为 C# 结构

c# - ASP.NET 哈希 PW + 盐混淆

java - java中从文件中获取私钥