一、算法使用介绍
MD5withRSA算法是一种数字签名算法,其工作原理是将正文通过MD5数字摘要处理后,再次通过RSA公钥加密生成数字签名,并将明文与密文以及公钥发送给对方。对方拿到私钥/公钥对数字签名进行解密,然后解密后的明文经过MD5加密与原明文进行比较,如果一致则通过。
二、功能实现
工具类代码及使用方法如下:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.util.Base64;
/**
* MD5withRSA签名算法工具类
* @since 2023-09-14 10:23
*
*/
public class MD5withRSAUtil {
private static final String RSA = "RSA";
private static final String ALGORITHM = "MD5withRSA";
/**
* 生成RSA密钥
* @return
* @throws NoSuchAlgorithmException
*/
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA);
keyPairGenerator.initialize(2048, new SecureRandom());
return keyPairGenerator.genKeyPair();
}
/**
* 使用私钥对明文进行签名
*
* @param plainText 明文
* @param privateKey 私钥
* @return 签名结果
* @throws Exception 签名异常
*/
public static String sign(String plainText, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance(ALGORITHM);
signature.initSign(privateKey);
signature.update(plainText.getBytes());
byte[] signedData = signature.sign();
return Base64.getEncoder().encodeToString(signedData);
}
/**
* 使用公钥对签名进行验证
*
* @param plainText 明文
* @param signature 签名结果
* @param publicKey 公钥
* @return 验证结果,true表示验证通过,false表示验证失败
* @throws Exception 验证异常
*/
public static boolean verify(String plainText, String signature, PublicKey publicKey) throws Exception {
Signature signatureObj = Signature.getInstance(ALGORITHM);
signatureObj.initVerify(publicKey);
signatureObj.update(plainText.getBytes());
byte[] decodedSignature = Base64.getDecoder().decode(signature);
return signatureObj.verify(decodedSignature);
}
public static void main(String[] args) throws Exception {
// 生成RSA密钥对
KeyPair keyPair = generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
// 明文
String plainText = "hello world";
// 使用私钥对明文进行签名
String signature = MD5withRSAUtil.sign(plainText, privateKey);
System.out.println("签名结果:" + signature);
// 使用公钥对签名进行验证
boolean result = MD5withRSAUtil.verify(plainText, signature, publicKey);
System.out.println("验证结果:" + result); // true表示验证通过,false表示验证失败
}
}