以下是一个使用Java编写的RSA方式的数据签名和验签的示例代码。在该示例中,服务端和客户端分别生成RSA公私钥对,并进行公钥交换。
java Copy code
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;
public class RSASignatureExample {
public static void main(String[] args) {
try {
// 服务端生成RSA密钥对,用于签名
KeyPair serverKeyPair = generateKeyPair();
PublicKey serverPublicKey = serverKeyPair.getPublic();
PrivateKey serverPrivateKey = serverKeyPair.getPrivate();
// 客户端生成RSA密钥对,用于签名
KeyPair clientKeyPair = generateKeyPair();
PublicKey clientPublicKey = clientKeyPair.getPublic();
PrivateKey clientPrivateKey = clientKeyPair.getPrivate();
// 模拟服务端给客户端发送数据
String data = "Hello, Client!";
byte[] signature = sign(data, serverPrivateKey);
// 模拟客户端接收到数据后进行验签
boolean verified = verify(data, signature, serverPublicKey);
System.out.println("服务端验签结果:" + verified);
// 模拟客户端给服务端发送数据
String response = "Hello, Server!";
byte[] responseSignature = sign(response, clientPrivateKey);
// 模拟服务端接收到数据后进行验签
boolean responseVerified = verify(response, responseSignature, clientPublicKey);
System.out.println("客户端验签结果:" + responseVerified);
} catch (Exception e) {
e.printStackTrace();
}
}
// 生成RSA密钥对
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
// RSA签名
public static byte[] sign(String data, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data.getBytes(StandardCharsets.UTF_8));
return signature.sign();
}
// RSA验签
public static boolean verify(String data, byte[] signature, PublicKey publicKey) throws Exception {
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initVerify(publicKey);
sig.update(data.getBytes(StandardCharsets.UTF_8));
return sig.verify(signature);
}
}
上述代码中,generateKeyPair方法用于生成RSA密钥对。sign方法使用私钥对给定的数据进行签名,并返回签名结果。verify方法使用公钥对数据和签名进行验签,并返回验签结果。
在示例中,服务端和客户端分别生成自己的RSA密钥对,并互相交换公钥。然后,服务端使用自己的私钥对数据进行签名,客户端使用服务端的公钥进行验签;客户端使用自己的私钥对数据进行签名,服务端使用客户端的公钥进行验签。
请注意,上述示例仅用于演示目的,实际应用中需要妥善保管私钥,确保数据的完整性和安全性。