RSA私钥加签和公钥验签
RSA是一种非对称加密算法,它使用两种不同的密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据。在加密过程中,数据只能通过私钥进行解密。在数字签名中,我们使用私钥进行签名,然后使用公钥进行验证,以确保数据的完整性和真实性。
RSA算法原理RSA算法是基于数论中的质因数分解问题,其基本原理如下:
- 选择两个不同的质数p和q,并计算它们的乘积n。
- 计算欧拉函数ϕ(n),ϕ(n) = (p-1) * (q-1)。
- 选择满足1的整数e < e < ϕ(n),且e与ϕ(n)互质。
- 计算e的模反元素d,以满足d * e ≡ 1 (mod ϕ(n))。
- 公钥为(e, n),私钥为(d, n)。
我们可以使用Javajava.security
包下的KeyPairGenerator
和Signature
类别进行私钥加签操作。以下是示例代码:
import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.Signature;public class RSASignatureExample { public static void main(String[] args) throws Exception { // 1. 生成RSA密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 2. 获取私钥 PrivateKey privateKey = keyPair.getPrivate(); // 3. Signature对象初始化 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); // 4. 待签名的消息 byte[] message = "Hello, World!".getBytes(); // 5. 计算签名 signature.update(message); byte[] signatureBytes = signature.sign(); // 6. 打印签名结果 System.out.println("Signature: " + bytesToHex(signatureBytes)); } private static String bytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte b : bytes) { result.append(String.format("%02x", b)); } return result.toString(); }}
在上述代码中,我们首先生成了2048位RSA密钥对,然后获取私钥,并初始化了Signature对象,使用SHA256withRSA算法。然后,我们将要签名的信息传输并调用update
方法更新待签名数据。最后,我们使用它sign
方法计算签名结果并打印出来。
公钥验签操作类似于私钥加签,只需使用公钥初始化Signature对象,并调用verify
方法验签。以下是示例代码:
import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PublicKey;import java.security.Signature;public class RSAVerifyExample { public static void main(String[] args) throws Exception { // 1. 生成RSA密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 2. 获取公钥 PublicKey publicKey = keyPair.getPublic(); // 3. Signature对象初始化 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initVerify(publicKey); // 4. 待验签证的消息 byte[] message = "Hello, World!".getBytes(); // 5. 原始签名数据 byte[] signatureBytes = ...; // 假设这是由私钥签名获得的签名数据 // 6. 验签 signature.update(message); boolean verified = signature.verify(signatureBytes); // 7. 打印验证结果 System.out.println("Verified: " + verified); }}
在上述代码中,我们首先生成了2048位RSA密钥对,然后获取公钥,并初始化了Signature对象,使用SHA256withRSA算法。然后,我们输入待验签名的信息,获取原始签名数据。
