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

Nad*_*dla 9 java cryptography encryption-asymmetric encryption-symmetric

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

//加密

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

//解密

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

Maa*_*wes 14

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

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

更多信息在这里这里.

所以加密是:

// 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));
Run Code Online (Sandbox Code Playgroud)

和解密是:

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

  • @PeterBecker最好不要这样想.检查[RFC 3447第5.2部分](http://tools.ietf.org/html/rfc3447#page-12):"......每个原语中的主要数学运算是取幂,如截面的加密和解密原语5.1.RSASP1和RSAVP1与RSADP和RSAEP相同,除了它们的输入和输出参数的名称;它们的区别在于它们用于不同的目的." 这仅适用于"教科书"或"原始"RSA,它不适合正常的加密目的.填充是该方案的组成部分,并且有所不同. (3认同)

dha*_*arr 6

公钥私钥加密的工作原理:

  1. 如果您使用私钥加密某些内容,任何拥有您公钥的人都可以对其进行解密.
  2. 如果您使用公钥加密某些内容,则只有您的私钥可以对其进行解密.

您必须生成公钥私钥对.私钥仅供您使用,公钥可以提供给您信任的人.

如何生成密钥对?

$ openssl genrsa -out private_key.pem 1024
$ openssl rsa -pubout -in private_key.pem -out public_key.pem
Run Code Online (Sandbox Code Playgroud)

或者在这里用java做 - > JAVA RSA 当你这样做时,回过头来问更多的问题