我读过关于密码学(对称和非对称)方法的文章。很多文章都说私钥用于加密和解密数据。公钥用于加密数据。但是当我尝试用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);
答案 0 :(得分: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));
和解密是:
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)
公钥加密如何运作:
您必须生成公钥私钥对。私钥仅供您使用,公钥可以提供给您信任的人。
如何生成密钥对?
$ 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 +数据=签名=>服务器/发行者(使用私钥打开/验证它)