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