我使用以下命令生成了公钥和私钥:
openssl genrsa -out D:\opensslkeys\privatekey1.pem 1024
openssl pkcs8 -topk8 -inform PEM -outform DER -in D:\opensslkeys\privatekey1.pem -out D:\opensslkeys\privatekey1.der -nocrypt
openssl rsa -in D:\opensslkeys\privatekey1.pem -pubout -outform DER -out D:\opensslkeys\publickey1.der
然后我编写了一个Java程序来签署一条消息然后验证它,它起作用了:
String message = "Hello world";
File privateKey = new File("privatekey.der");
KeyPair keyPair = readKeyPair(privateKey, "happy".toCharArray());
PrivateKey privkey= PrivateKeyReader.get("privatekey.der");
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privkey);
signature.update(message.getBytes());
byte [] signatureBytes=new byte[512];
signatureBytes= signature.sign();
PublicKey pubk=PublicKeyReader.get("publickey.der");
byte[] encodedPublicKey1=pubk.getEncoded();
Signature verifier = Signature.getInstance("SHA256WithRSA");
verifier.initVerify(pubk);
verifier.update(message.getBytes());
if (verifier.verify(signatureBytes)) {
System.out.println("Signature is valid");
} else {
System.out.println("Signature is invalid");
}
但在验证后我需要恢复消息。请解释如何做到这一点。
答案 0 :(得分:2)
签署邮件不会使其无法读取,因此没有"恢复"需要步骤。签名是一些额外的数据,可以在同一个文件中,也可以单独存储。签名允许消息的读者验证谁编写了消息(通过验证签名的公钥)以及消息未被更改。
如果您想向某人发送已签名的消息,请向他们提供明文消息和签名。然后,他们可以使用您的公钥来验证签名。签名基于邮件摘要和您的私钥。验证步骤计算消息的摘要,并使用公钥验证摘要的签名。如果公钥与签名中使用的私钥不对应,或者消息摘要不匹配,则签名被检测为无效。
相关操作将加密消息。这肯定会使消息不可读。加密将使用公钥,只有相关私钥的持有者才能解密该消息。
答案 1 :(得分:0)
您已收到消息。
你不能从签名中“恢复”它,如果这是你所指的。签名不是加密。