RSA

 

实现签名与验证:

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();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值