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)
公钥私钥加密的工作原理:
您必须生成公钥私钥对.私钥仅供您使用,公钥可以提供给您信任的人.
如何生成密钥对?
$ 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 当你这样做时,回过头来问更多的问题
| 归档时间: |
|
| 查看次数: |
27067 次 |
| 最近记录: |