java rsa加密和签名
时间: 2023-07-07 20:03:55 浏览: 119
RSA加密和签名都是基于RSA算法的,但是加密和签名的目的和流程有所不同。
RSA加密流程如下:
1. 选择两个大质数p和q,计算n=p*q,并记为RSA模数。
2. 计算欧拉函数φ(n)=(p-1)*(q-1)。
3. 选择一个整数e,1<e<φ(n),且e与φ(n)互质,e作为公钥指数。
4. 计算d,使得d*e≡1(mod φ(n)),d作为私钥指数。
5. 加密时,对明文m进行加密,计算c=m^e(mod n)。
6. 解密时,对密文c进行解密,计算m=c^d(mod n)。
RSA签名流程如下:
1. 选择两个大质数p和q,计算n=p*q,并记为RSA模数。
2. 计算欧拉函数φ(n)=(p-1)*(q-1)。
3. 选择一个整数e,1<e<φ(n),且e与φ(n)互质,e作为签名者的私钥指数。
4. 计算d,使得d*e≡1(mod φ(n)),d作为签名者的公钥指数。
5. 对消息m进行签名,计算s=m^d(mod n)。
6. 验证签名时,对接收到的消息m和签名s进行验证,计算m'=s^e(mod n),如果m'=m,则验证通过。
下面是Java代码示例:
RSA加密:
```java
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
public class RSAEncrypt {
public static void main(String[] args) throws Exception {
String plainText = "Hello, world!";
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedText = cipher.doFinal(plainText.getBytes());
System.out.println("加密后的密文:" + new String(encryptedText));
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedText = cipher.doFinal(encryptedText);
System.out.println("解密后的明文:" + new String(decryptedText));
}
}
```
RSA签名:
```java
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
public class RSASign {
public static void main(String[] args) throws Exception {
String plainText = "Hello, world!";
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(plainText.getBytes());
byte[] signedText = signature.sign();
System.out.println("签名后的内容:" + new String(signedText));
signature.initVerify(publicKey);
signature.update(plainText.getBytes());
boolean result = signature.verify(signedText);
System.out.println(result ? "验签成功" : "验签失败");
}
}
```
阅读全文