【问题标题】:AES 128 DOT NET and Java CompatibilityAES 128 DOT NET 和 Java 兼容性
【发布时间】:2011-05-14 15:08:46
【问题描述】:

我们一直在尝试在两个系统之间加密解密数据的方案原型:一个在 .NET 中,另一个在 Java 中。我们将使用简单的 128 位 AES 加密。

我面临的问题是微不足道的,但我找不到合适的解决方案。也许我对 AES 或一般加密的理解较少。

假设我们有一个预定义的密钥,由以下十六进制字符串表示:“9c361fec3ac1ebe7b540487c9c25e24e”。 这是一个 16 字节的密钥。 Java中的加密部分是

  final byte[] rawKey = hexStringToByteArray("9c361fec3ac1ebe7b540487c9c25e24e");
  final SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
  // Instantiate the cipher
  final Cipher cipher = Cipher.getInstance("AES");
  cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

  final byte[] encrypted = cipher.doFinal(plainText.getBytes());

“hexStringToByteArray”函数将十六进制字符串转换为字节数组。问题是在java中,字节是有符号的。所以值 9C 是 -100 而不是 156(就像在 .NET 中那样)。

在 Java 中变成:-100,54,31,-20,58,-63,-21,-25,-75,64,72,124,-100,37,-30,78

然而,在 .NET 中,这是:156,54,31,236,58,193,235,231,181,64,72,124,156,37,226,78

问题: 鉴于密钥本身的表示不同,它会影响加密过程本身吗? 这是没有 CBC 和 PADDING 的简单加密。

编辑:更新了代码以使其看起来格式化。

【问题讨论】:

  • 您好,我也遇到了同样的问题。我的 java 加密数据不同于 .net 加密数据。我采用了与您相同的方法。需要你的帮助。

标签: java .net cryptography aes


【解决方案1】:

我不认为你有任何问题。您在两个平台上都获得了完全相同的数据。一个版本将其显示为有符号数据,另一个显示为无符号数据......但位本身是相同的。

我不认为将这些密钥用于加密时会出现任何问题。

【讨论】:

  • 我实际上必须跨 C#、Java 和 Delphi 执行此操作。只要加密算法相同,就应该可以。
  • 发布此问题后,我在回家的路上意识到了这一点。底层位应该是一样的! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2014-06-12
  • 2014-09-24
  • 2013-01-16
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多