gpt4 book ai didi

java - SHA1 和 RSA 与 java.security.Signature 对比 MessageDigest 和 Cipher

转载 作者:IT老高 更新时间:2023-10-28 13:52:20 28 4
gpt4 key购买 nike

我试图了解 Java java.security.Signature 类的作用。如果我计算一个 SHA1 消息摘要,然后使用 RSA 加密该摘要,我会得到与要求 Signature 类签署相同内容不同的结果:

// Generate new key
KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
String plaintext = "This is the message being signed";

// Compute signature
Signature instance = Signature.getInstance("SHA1withRSA");
instance.initSign(privateKey);
instance.update((plaintext).getBytes());
byte[] signature = instance.sign();

// Compute digest
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] digest = sha1.digest((plaintext).getBytes());

// Encrypt digest
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] cipherText = cipher.doFinal(digest);

// Display results
System.out.println("Input data: " + plaintext);
System.out.println("Digest: " + bytes2String(digest));
System.out.println("Cipher text: " + bytes2String(cipherText));
System.out.println("Signature: " + bytes2String(signature));

结果(例如):

Input data: This is the message being signed
Digest: 62b0a9ef15461c82766fb5bdaae9edbe4ac2e067
Cipher text: 057dc0d2f7f54acc95d3cf5cba9f944619394711003bdd12...
Signature: 7177c74bbbb871cc0af92e30d2808ebae146f25d3fd8ba1622...

我一定对 Signature 正在做的事情有一个根本性的误解 - 我已经对其进行了跟踪,它似乎正在对 MessageDigest 对象调用更新,其中如我所料,算法设置为 SHA1,然后获取摘要,然后进行加密。是什么导致结果不同?

编辑:

Leonidas 让我检查签名方案是否应该按照我的想法去做。 RFC 中定义了两种类型的签名。 :

first of these (PKCS1)是我上面描述的那个。它使用哈希函数创建摘要,然后使用私钥对结果进行加密。

second algorithm使用随机盐值,更安全但不确定。如果重复使用相同的 key ,上面代码产生的签名不会改变,所以我认为它不可能是PSS。

编辑:

这是我使用的 bytes2string 方法:

private static String bytes2String(byte[] bytes) {
StringBuilder string = new StringBuilder();
for (byte b : bytes) {
String hexString = Integer.toHexString(0x00FF & b);
string.append(hexString.length() == 1 ? "0" + hexString : hexString);
}
return string.toString();
}

最佳答案

好的,我已经弄清楚发生了什么。 Leonidas 是对的,它不仅仅是被加密的哈希(在 Cipher 类方法的情况下),它是与摘要连接的哈希算法的 ID:

  DigestInfo ::= SEQUENCE {
digestAlgorithm AlgorithmIdentifier,
digest OCTET STRING
}

这就是 Cipher 和 Signature 的加密方式不同的原因。

关于java - SHA1 和 RSA 与 java.security.Signature 对比 MessageDigest 和 Cipher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521101/

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