我们一直在尝试一种方案的原型,我们在两个系统之间加密解密数据:一个在.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的简单加密。
修改:更新了要查看格式的代码。
答案 0 :(得分:3)
我认为你根本没有问题。您在两个平台上都拥有完全相同的数据。一个版本将其显示为带符号数据,另一个版本显示为无符号...但这些位本身是相同的。
我不希望使用这些密钥进行加密会有任何问题。