使用公钥/私钥恢复已签名的邮件

时间:2015-03-28 01:13:39

标签: java encryption bouncycastle private-key public-key

我使用以下命令生成了公钥和私钥:

  • 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");
    }

但在验证后我需要恢复消息。请解释如何做到这一点。

2 个答案:

答案 0 :(得分:2)

签署邮件不会使其无法读取,因此没有"恢复"需要步骤。签名是一些额外的数据,可以在同一个文件中,也可以单独存储。签名允许消息的读者验证谁编写了消息(通过验证签名的公钥)以及消息未被更改。

如果您想向某人发送已签名的消息,请向他们提供明文消息和签名。然后,他们可以使用您的公钥来验证签名。签名基于邮件摘要和您的私钥。验证步骤计算消息的摘要,并使用公钥验证摘要的签名。如果公钥与签名中使用的私钥不对应,或者消息摘要不匹配,则签名被检测为无效。

相关操作将加密消息。这肯定会使消息不可读。加密将使用公钥,只有相关私钥的持有者才能解密该消息。

答案 1 :(得分:0)

您已收到消息。

你不能从签名中“恢复”它,如果这是你所指的。签名不是加密。