【PKI】1.RSA做签名

【PKI】1.RSA做签名

1. 写一段程序,产生一个RSA 2048的密钥对,用这个密钥对一段固定的数据(比如字符串 12345678)进行签名,告诉我在你的机器上一秒钟能签多少次。

分析:这个功能分两部分==》 产生密钥对、对数据做签名

首先,产生密钥对需要 KeyPairGenerator(密钥生成器)、并初始化、设置长度。

然后,获得密钥对,分别获得 公钥 和 私钥

最后,使用私钥对数据做签名需要 Signature、并初始化、update、sign。

package work_1;
 
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
 
import jdk.nashorn.internal.objects.annotations.Where;
 
/*
 * Java程序生成 RSA 2048密钥对,
 *   并使用私钥 对数据 做签名,
 *   测试一秒可以完成多少次签名
 * */
public class RSA_1 {
	
	private static RSA_1 rsa1 = new RSA_1();
	// 待签名数据
	public String src = "12345678";
	
	public static void main(String[] args){
		// 所有的逻辑处理封装起来了
		rsa();
	}
	// 业务逻辑
	public static void rsa(){
		
		try {
			// 1. 生成 密钥对
			Object[] keys = rsa1.generatorKeyPair();
			RSAPublicKey rsaPublicKey = (RSAPublicKey) keys[0];
			RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keys[1];
			
			// 2.  对数据做签名
			rsa1.Sign(rsaPrivateKey);
		
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}
	// 1. 生成密钥对
	private Object[] generatorKeyPair() throws NoSuchAlgorithmException{
		
		// 1. 获取 一个 密钥生成器
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(2048);
		//   生成一个 密钥对
		KeyPair keyPair = keyPairGenerator.generateKeyPair();		
		//   获取 公钥  和 私钥
		PublicKey publicKey = keyPair.getPublic();
		PrivateKey privateKey = keyPair.getPrivate();
		
		// 将 密钥返回
		Object[] keys = new Object[2];
		keys[0] = publicKey;
		keys[1] = privateKey;
	
		return keys;
	}
	// 2. 对数据做签名
	private void Sign(RSAPrivateKey rsaPrivateKey) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException{
		//  1. 选择一个 摘要算法
		Signature signature = Signature.getInstance("MD5WithRSA");
		//  2. 初始化 私钥
		signature.initSign(rsaPrivateKey);
		//  3. 更新 数据(字节数组)将 string编码为 字节数组
		signature.update(src.getBytes());
		
		int count = 0;
		long before = System.currentTimeMillis();
		/*
		// 检测 签名180次耗时
		while(count < 180){
			// 4. 签名
			signature.sign();
			count++;
		}
		long after = System.currentTimeMillis();
		System.out.println("RSA2048使用MD5对12345678做签名处理180次耗时:"+ (after - before));
		*/
		
		// 检测 1s可以完成签名多少次
		while(!(System.currentTimeMillis() - before > 1000)){
			// 4. 签名
			signature.sign();
			count++;
		}
		System.out.println("RSA2048使用MD5对12345678做签名1s完成:"+ count + "次");	
	}
}

完成了测试,分别提供,测试1s完成的次数,以及 完成180次的用时。

导师说我的 时间处理上可以更优化,但是我想不出来,先放一放吧。

刚做完,他说让我消化一下,然后直接又甩一个新题过来。啊。

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments