java - AES 128 DOT NET 和 Java 兼容性

标签 java .net cryptography aes

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

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

假设我们有一个预定义的 key ,由以下十六进制字符串表示:“9c361fec3ac1ebe7b540487c9c25e24e”。 这是一个 16 字节的 key 。 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

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

编辑:将代码更新为格式化。

最佳答案

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

我认为使用这些 key 进行加密不会有任何问题。

关于java - AES 128 DOT NET 和 Java 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4259082/

相关文章:

python - 使用 Crypto 打印 RSA 解密的字节字符串?

java - 如何正确使用 bouncycaSTLe 的 PaddedBufferedBlockCipher?

java - eclipse 3.8 : Call Hierarchy misses callers from jars

c# - Powershell 中的 MessageBox 未置于最前面

java - 需要有关我的程序在 String 中查找重复项的效率的输入

c# - 检测 web.config 已更改

.net - 如何在.NET中使用ColorMatrix改变亮度、颜色、饱和度、色调

java - 添加 PDF 撤销信息作为签名属性 pdfRevocationInfoArchival OID 1.2.840.113583.1.1.8

java - Grails中拦截Spring Security获取一些请求参数

java - 为什么 Cobertura 在通过 Eclipse 插件运行时报告覆盖率为 0%?