gpt4 book ai didi

Java DES/ECB/PKCS5Padding加密值不一样

转载 作者:行者123 更新时间:2023-12-05 07:10:14 35 4
gpt4 key购买 nike

我正在尝试使用带有硬编码 key 的 DES/ECB/PKCS5Padding 算法在 Java 中加密相同的数据。我使用 online tool 验证了我的加密值。如果我使用带有特殊字符的 key ,则 Java 和 online tool 加密值不相同。

如果我使用 key 2b7e151628aed2a6abf71589 并输入文本 1234 那么加密结果与 online tool 相同。这段文字用Java加密后的结果是SRC/0ptoT78=online tool一样,附上图片引用Result

但如果我使用 key /£½ZBÝy‚÷Í( Ó—&*Ænù;'³ 并再次输入文本 1234 则加密结果与 online tool 不同. 这段文字用Java加密后的结果是UUoh48bB9dM=online tool不一样,附上图片引用Result

我的java代码如下

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;

public class Main {

public static void main(String[] args) {
try {
System.out.println(encrypt("/£½ZBÝy‚÷Í( Ó—&*Ænù­;‘³", "1234"));

System.out.println(encrypt("2b7e151628aed2a6abf71589", "1234"));

} catch (Exception e) {
e.printStackTrace();
}
}

public static String encrypt(String key, String str) throws Exception {



DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
System.out.println(new String(key.getBytes(), "UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
Key secretKey = keyFactory.generateSecret(desKeySpec);

cipher.init(Cipher.ENCRYPT_MODE, secretKey);


byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));

byte[] base64Bytes = Base64.encodeBase64(bytes);
return new String(base64Bytes);
}


public static String decrypt(String key, String str) throws Exception {
byte[] data =Base64.decodeBase64(str);
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(data);
return new String(decryptedBytes, "gb2312");
}
}

最佳答案

这很可能是您的本地默认编码与网站默认编码之间存在冲突。

要解决它,请在提取 key 的字节时指定编码:

import static java.nio.charsets.StandardCharsets.UTF_8;
...
DESKeySpec dks = new DESKeySpec(key.getBytes(UTF_8))

另外,您指定了一个非标准编码,gb2312。尝试改用 UTF-8、UTF-16 或类似的格式。

return new String(decryptedBytes, UTF_8);

如果它仍然不起作用,请尝试使用 StandardCharsets 中可用的其他值(参见 Javadoc)。

关于Java DES/ECB/PKCS5Padding加密值不一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61301475/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com