gpt4 book ai didi

Java 加密/安全错误

转载 作者:行者123 更新时间:2023-12-02 05:11:04 26 4
gpt4 key购买 nike

下面有一些代码,它应该使用 SHA1 创建消息的哈希值,打印哈希值,使用 RSA 算法加密消息,打印出加密的消息,然后解密消息并再次打印哈希值。第一个和第三个打印消息应该匹配,因为它们都是原始消息的未加密哈希,但在我的代码中它们不匹配 - 谁能告诉我为什么?谢谢。我的代码如下:

    String          input = "input message test";
MessageDigest hash = MessageDigest.getInstance("SHA1");

hash.update(Utils.toByteArray(input));

System.out.println("digest : " +hash.digest());

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
SecureRandom random = new SecureRandom();

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");

generator.initialize(512, random);

KeyPair pair = generator.generateKeyPair();
Key pubKey = pair.getPublic();
Key privKey = pair.getPrivate();

cipher.init(Cipher.ENCRYPT_MODE, privKey);

byte[] ciphertext = cipher.doFinal(hash.digest());

System.out.println("cipher: " + ciphertext);

cipher.init(Cipher.DECRYPT_MODE, pubKey);

byte[] plaintext = cipher.doFinal(ciphertext);

System.out.println("plaintext : " + plaintext);

更新:我已经有了这个,我只是将其删除,因为它在第二个文件中。我的方法是:

    public static String toHex(byte[] data, int length) {
StringBuffer buf = new StringBuffer();

for (int i = 0; i != length; i++) {
int v = data[i] & 0xff;

buf.append(digits.charAt(v >> 4));
buf.append(digits.charAt(v & 0xf));
}

return buf.toString();
}

但这会返回:

digest : b2cad21e87dbd57f1a1928e4013b56fb553bb82a
cipher: 502cffa545bda39f677b72f677f1a6a4308a329747a8f4de9b0d1ffd83fcec10c5b41a218201e204c7949b45a8119eb42e6ab5dc0c97f97b6d59600632d2b2ad
plaintext : da39a3ee5e6b4b0d3255bfef95601890afd80709

最佳答案

哈希摘要只需完成一次( see the doc ):

System.out.println("digest : " + hash.digest());   //1
byte[] ciphertext = cipher.doFinal(hash.digest()); //2

调用hash.digest()一次创建摘要,然后重置哈希对象。这就是为什么你会得到不同的输出。

以下是我所做的更改:

 byte[] inputHash = hash.digest();
System.out.println("digest : " + bytesToHex(inputHash));
byte[] ciphertext = cipher.doFinal(inputHash);

这是我得到的输出:

digest    : 4b03b72ccc3b238e3df3c0a9dcb8d03fd6417848
plaintext : 4b03b72ccc3b238e3df3c0a9dcb8d03fd6417848

您可以使用任何字节数组进行十六进制转换。以下是您可以使用的片段:

public static String bytesToHex(byte[] hash) {
StringBuffer hexString = new StringBuffer();

for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}

return hexString.toString();
}

关于Java 加密/安全错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27341489/

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