【问题标题】:AES encryption between Delphi and JavaDelphi和Java之间的AES加密
【发布时间】:2020-06-26 08:35:38
【问题描述】:

在 Java 和 Delphi 之间使用加密参数进行通信。 如果 Delphi 加密它们,Java 需要解密它们。 但是如果我如下操作,Java会报错... Java酱应该怎么换?

[Delphi源码(加密)]

var
  Data: string;
begin
  Data := Memo1.Text;
  DCP_rijndael1.InitStr(Edt_Password.Text, TDCP_sha256);
  DCP_rijndael1.EncryptCBC(Data[1],Data[1],Length(Data));
  DCP_rijndael1.Burn;
  Memo2.Text := Base64EncodeStr(Data);
end;

[Delphi源码(解密)]

var
  Data: string;
begin
  Data := Base64DecodeStr(Memo2.Text);
  DCP_rijndael1.InitStr(Edt_Password.Text, TDCP_sha256);
  DCP_rijndael1.DecryptCBC(Data[1],Data[1],Length(Data));
  DCP_rijndael1.Burn;
  Memo3.Text := Data;
end;

[Java源码]

public static String Decrypt(String text, String key) throws Exception

{

          Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

          byte[] keyBytes= new byte[16];

          byte[] b= key.getBytes("UTF-8");

          int len= b.length;

          if (len > keyBytes.length) len = keyBytes.length;

          System.arraycopy(b, 0, keyBytes, 0, len);

          SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

          IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);

          cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);


          sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();

          byte [] results = cipher.doFinal(decoder.decodeBuffer(text));

          return new String(results,"UTF-8");

}

【问题讨论】:

  • 这里的问题是什么?看起来你只是想让我们为你编写这段代码。
  • 我正在将此代码更改为 java 版本
  • 你能和我们分享你的Java代码吗?
  • 我修改了我的写作
  • 在 Delphi 中,字符串是 Unicode 类型,但在 Java 代码中,您将字符串视为 UTF-8,这是不一样的。

标签: java delphi encryption aes rijndael


【解决方案1】:

Delphi 代码定义应使用 SHA-256 对密码进行哈希处理。 (TDCP_sha256)。 我不知道 DCP 加密是如何实现的,但我假设密码的 SHA256 哈希用作 AES 密钥,因此这里使用 AES256。

然而,Java 代码并没有使用任何 SHA-256 来散列 key,因为它在这里被调用。

此外,在 Delphi 方面,您使用 CBC 模式,但您没有通过 SetIV 方法指定 IV。在 Java 方面,您使用严重不安全的密钥指定 IV)。 IV 必须由安全随机数据初始化。永远不要使用不同的东西!

常见的方法是在加密之前生成一个随机 IV,然后在其前面添加加密数据并在解密之前将其读回。

【讨论】:

  • SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "SHA-256");
  • 这是一个错误。我需要纠正哪一部分?可以举个例子吗?
  • Java 中没有“自动散列”。为 SHA256 创建一个 MessageDigest,对密码进行哈希处理并在 SecretKeySpec 中使用结果。 stackoverflow.com/a/5531479/150978
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多