AES 128 DOT NET和Java兼容性

时间:2010-11-23 17:43:51

标签: java .net cryptography aes

我们一直在尝试一种方案的原型,我们在两个系统之间加密解密数据:一个在.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的简单加密。

修改:更新了要查看格式的代码。

1 个答案:

答案 0 :(得分:3)

我认为你根本没有问题。您在两个平台上都拥有完全相同的数据。一个版本将其显示为带符号数据,另一个版本显示为无符号...但这些位本身是相同的。

我不希望使用这些密钥进行加密会有任何问题。