java使用RSA加密方式,实现数字签名
程序员文章站
2024-03-19 13:13:52
...
全栈工程师开发手册 (作者:栾鹏)
java使用RSA加密方式,实现数字签名。数字签名,使用私钥获取签名,使用公钥校验签名
测试代码
public static void main(String args[]) throws Exception{
DigitalSignDemo ds=new DigitalSignDemo();
ds.generateKey(); //产生私钥和公钥
byte[] signeddata=ds.sign("test.txt"); //文件签名
// 打印签名
for(int i=0; i<signeddata.length; i++){
System.out.println(signeddata[i]);
}
ds.checkSign("test.txt",signeddata); //校验签名
}
数字签名工具类的实现
package com.lp.app.safe;
import java.io.*;
import java.security.*;
import java.security.interfaces.*;
public class DigitalSignDemo{
PublicKey pbkey;
PrivateKey prkey;
public void generateKey() {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
pbkey = kp.getPublic();
prkey = kp.getPrivate();
} catch (Exception e) {
}
}
//文件签名
public byte[] sign(String path) throws Exception{
//获取要签名的数据
FileInputStream f = new FileInputStream(path);
int num = f.available();
byte[] data = new byte[num];
f.read(data);
// 获取私钥
RSAPrivateKey prk = (RSAPrivateKey)prkey;
Signature s = Signature.getInstance("MD5WithRSA");
s.initSign(prk);
s.update(data);
//数据签名
byte[] signeddata = s.sign();
return signeddata;
}
//校验签名
public void checkSign(String path,byte[] signeddata) throws Exception{
FileInputStream f = new FileInputStream(path);
int num = f.available();
byte[] data = new byte[num];
f.read(data);
// 读公钥
RSAPublicKey pbk = (RSAPublicKey)pbkey;
// 获取对象
Signature s = Signature.getInstance("MD5WithRSA");
//初始化
s.initVerify(pbk);
// 传入原始数据
s.update(data);
boolean ok = false;
try{
//用签名验证原始数据
ok = s.verify(signeddata);
System.out.println(ok);
}
catch(SignatureException e){
System.out.println(e);
}
System.out.println("校验结束!");
}
}
下一篇: Java 数字签名(一)