我们一直在尝试一个方案的原型,我们在两个系统之间加密解密数据:一个是.NET系统,另一个是Java系统。我们将使用简单的128位AES加密。
我所面临的问题是微不足道的,但我无法找到适当的解决办法。也许我对AES或加密的理解一般较少。
假设我们有一个预定义的键,由以下十六进制字符串表示:“9c361fer3ac1ebe7b540487c9c25e24e”。这是一个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和填充。
编辑:更新了代码,使其看起来是格式化的。
发布于 2010-11-23 17:47:35
我觉得你一点问题都没有。在这两个平台上都有完全相同的数据。一个版本显示为签名数据,另一个版本显示为无符号数据.但这些细节本身是一样的。
我认为在密码学中使用这些密钥不会有任何问题。
https://stackoverflow.com/questions/4259082
复制相似问题