实现签名与验证:
package com.fosu.rsa;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import com.fosu.util.Base64;
/**
* @author ZL
*
* 利用rsa生成一对公私钥
* SHA1withRSA进行签名与验签
* 可参考https://docs.oracle.com/javase/tutorial/security/apisign/index.html
*/
public class RSATest {
public static void main(String[] args) throws Exception{
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(2048);
KeyPair pair = gen.generateKeyPair();
//rsa生成一对公私钥
PublicKey publicKey = pair.getPublic();
PrivateKey privateKey = pair.getPrivate();
String str = "sss";
List<String> list = send(privateKey,str);
/**
* list.get(0); str 代表中间传输的数据
* list.get(1); sign
*/
boolean flag = receive(publicKey,list);
System.out.println(flag);
}
// 发送方
public static List<String> send(PrivateKey privateKey, String str) throws Exception{
//SHA1withRSA算法进行签名
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initSign(privateKey);
byte[] data = str.getBytes();
// 更新用于签名的数据
sign.update(data);
byte[] signature = sign.sign();
String sign_ = Base64.encode(signature);
System.out.println(Arrays.toString(signature));
//String sign_ = new String(signature, StandardCharsets.US_ASCII);
List<String> list = new ArrayList<>();
list.add(str);
list.add(sign_);
return list;
}
// 校验方
public static boolean receive(PublicKey publicKey,List<String> list) throws Exception{
String str = list.get(0);
String sign = list.get(1);
System.out.println("sign:"+sign);
//byte[] signbyte = sign.getBytes(StandardCharsets.US_ASCII);
byte[] signbyte = Base64.decode(sign);
System.out.println(Arrays.toString(signbyte));
Signature verifySign = Signature.getInstance("SHA1withRSA");
verifySign.initVerify(publicKey);
//用于验签的数据
verifySign.update(str.getBytes());
boolean flag = verifySign.verify(signbyte);
System.out.println(flag);
return flag;
}
@Test
public void test() throws IOException {
try {
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(2048);
KeyPair pair = gen.generateKeyPair();
//rsa生成一对公私钥
PublicKey publicKey = pair.getPublic();
PrivateKey privateKey = pair.getPrivate();
//SHA1withRSA算法进行签名
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initSign(privateKey);
byte[] data = "sss".getBytes();
//更新用于签名的数据
sign.update(data);
byte[] signature = sign.sign();
Signature verifySign = Signature.getInstance("SHA1withRSA");
verifySign.initVerify(publicKey);
//用于验签的数据
verifySign.update(data);
boolean flag = verifySign.verify(signature);
System.out.println(flag);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}