【1. 使用Java产生RSA2048对数据做签名】

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完成的次数,以及 完成180ci的用时。

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

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

请看:https://blog.csdn.net/ca1m0921/article/details/81901924

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值