java实现采用1024bit长度密钥的RSA签名方式,加密算法使用MD5WithRSA,计算签名和验签的时候的需要使用GBK编码
时间: 2024-03-11 16:47:35 浏览: 132
PHP实现的MD5结合RSA签名算法实例
以下是使用Java实现采用1024bit长度密钥的RSA签名方式,加密算法使用MD5WithRSA,计算签名和验签的时候需要使用GBK编码的示例代码:
```java
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSASignature {
// 加载私钥
private static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
byte[] privateKeyBytes = Base64.decode(privateKeyStr);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(pkcs8KeySpec);
}
// 加载公钥
private static PublicKey loadPublicKey(String publicKeyStr) throws Exception {
byte[] publicKeyBytes = Base64.decode(publicKeyStr);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(x509KeySpec);
}
// MD5WithRSA数字签名
public static byte[] sign(String data, String privateKeyStr) throws Exception {
PrivateKey privateKey = loadPrivateKey(privateKeyStr);
Signature signature = Signature.getInstance("MD5WithRSA");
signature.initSign(privateKey);
signature.update(data.getBytes(StandardCharsets.GBK));
return signature.sign();
}
// MD5WithRSA数字签名验证
public static boolean verify(String data, byte[] sign, String publicKeyStr) throws Exception {
PublicKey publicKey = loadPublicKey(publicKeyStr);
Signature signature = Signature.getInstance("MD5WithRSA");
signature.initVerify(publicKey);
signature.update(data.getBytes(StandardCharsets.GBK));
return signature.verify(sign);
}
public static void main(String[] args) throws Exception {
// 待签名的数据
String data = "待签名的数据";
// 私钥
String privateKeyStr = "MIICXQIBAAKBgQDQz8t7jv2J2O3/6K4s5w2o+1rPnXy7Yd9b5T5psT1y9t2JQeN7u8o7FpKk3M0W1LrPa0GZDf9kDzU7JEr4yvIL1FZBnYK6sCp+P7Wt2dG0yq8a8m7ZLYvN1Jj+H4+M2vBNQGJ6uVQh8yKZ6Q/2m+EEJnJp4DjH/0CmK2yFjz7SjQIDAQABAoGBAIr2+UJ8t3iDjugg6d9wq9TjZa+qvg0tIuQvJrP6oXh0DyMIQ1ASlRkYnVpYiM4xi3/2tE5L0GnNSB2f5cP3N6LnoBBWb/0DLwE9k6E3Uz5YyZkzCSfO5I/6xUy/xU+OJ2vJWZi+T+M4b6Vz1NpGUK2QtDSZq9Cvpyj/xpJ8x8CBAkEA/9aMx9xjYBqC2sP6jwJf0C4kIvzOJcV9uXjOyUejg3a/5RG8F+5j69yOIGs2aWxRrC8lH7fRrKJLuR3R4KwKZQJBAMj8/5IN5kL4yJz6vR0z6a5Dy8kQzZrR3HJlW2cVxQg5uH3a8zrjfGf3B+4e1Dn6a8Nq1F9zKztf+Ll5S3j8bZ8CQQCQr4QlJpX4QqoX4W0sNYI1jg3N5X3N9tNjsCJeQzlRQlFQv4Vu4f+/+wWzD+q2hIbJUJU0lC5gq9v6XNDL5zBAkEAt4semjy6bX1v8YRyQkLzXZtGnOeB6r5Z+DQzK6QVfzJnC7Y8H+txbVh1OT1Mjg0iE6sX7r2gkxjm3PjZ1x6v7QJBAJ4dWzrNfKXJY3z8xw6Xq8z3qW8QXhQaP7Iz3x7PnLhW8S2tQqzSfQlZbDj/Tz5dN0V4VjWlT7nYw2mSjKZT7jI=";
// 公钥
String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQz8t7jv2J2O3/6K4s5w2o+1rPnXy7Yd9b5T5psT1y9t2JQeN7u8o7FpKk3M0W1LrPa0GZDf9kDzU7JEr4yvIL1FZBnYK6sCp+P7Wt2dG0yq8a8m7ZLYvN1Jj+H4+M2vBNQGJ6uVQh8yKZ6Q/2m+EEJnJp4DjH/0CmK2yFjz7SjQIDAQAB";
// 进行MD5WithRSA数字签名
byte[] sign = sign(data, privateKeyStr);
System.out.println("数字签名:" + Base64.encode(sign));
// 进行MD5WithRSA数字签名验证
boolean verifyResult = verify(data, sign, publicKeyStr);
System.out.println("数字签名验证结果:" + verifyResult);
}
}
```
需要注意的是,在进行数字签名和验签的时候,需要使用相同的编码方式,这里使用的是GBK编码。同时,签名和验签的过程中,都需要对待签名的数据先进行MD5哈希计算。
阅读全文