使用Java中的私钥进行加密和解密

时间:2014-05-23 13:57:53

标签: java cryptography encryption-symmetric encryption-asymmetric

我读过关于密码学(对称和非对称)方法的文章。很多文章都说私钥用于加密和解密数据。公钥用于加密数据。但是当我尝试用Java开始实现时无法使用私钥加密和解密数据(我正在使用RSA算法)?如果有可能请给我一个链接。如果它不支持,请回答为什么它不支持?

//加密

Cipher encrypt=Cipher.getInstance("RSA");
encrypt.init(Cipher.ENCRYPT_MODE, privatekey);
byte[] encryptedMessage=encrypt.doFinal(msg.getBytes());

//解密

Cipher decrypt=Cipher.getInstance("RSA");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage=decrypt.doFinal(encryptedMessage);

3 个答案:

答案 0 :(得分:14)

要执行RSA加密,您需要使用公钥加密并使用私钥解密。此外,您应该使用定义明确的填充方法,例如PKCS#1 v1.5兼容填充或 - 如果可用 - OAEP填充。

使用RSA私钥进行加密毫无意义,因为任何拥有公钥的人都可以解密。有一种称为"原始RSA"这基本上是模幂运算,但只应使用和另一个填充方案来生成签名。在这种情况下,你希望每个人都有一个公钥来解密"验证签名。

更多信息herehere

所以加密是:

// specify mode and padding instead of relying on defaults (use OAEP if available!)
Cipher encrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
// init with the *public key*!
encrypt.init(Cipher.ENCRYPT_MODE, publicKey);
// encrypt with known character encoding, you should probably use hybrid cryptography instead 
byte[] encryptedMessage = encrypt.doFinal(msg.getBytes(StandardCharsets.UTF_8));

和解密是:

Cipher decrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
String decryptedMessage = new String(decrypt.doFinal(encryptedMessage), StandardCharsets.UTF_8);

答案 1 :(得分:6)

公钥加密如何运作:

  1. 如果您使用私钥加密任何人,请使用您的私钥 公钥可以解密它。
  2. 如果您使用公钥加密某些内容,只需使用您的私钥 可以解密它。
  3. 您必须生成公钥私钥对。私钥仅供您使用,公钥可以提供给您信任的人。

    如何生成密钥对?

    $ openssl genrsa -out private_key.pem 1024
    $ openssl rsa -pubout -in private_key.pem -out public_key.pem
    

    或者在java中执行此操作 - > JAVA RSA 当你这样做时,回来问更多问题

答案 2 :(得分:1)

使用私钥加密时,称为证书。并将您的公钥分发给客户端,以便他们可以打开它并验证证书的颁发者。客户端可以通过使用公钥加密来创建自己的签名的方式相同。服务器/发行者可以通过使用私钥解密来验证它的方式相同。

S:私钥 P:公钥

S +数据=证书=>客户端(使用公钥打开/验证) P +数据=签名=>服务器/发行者(使用私钥打开/验证它)