【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次的用时。
导师说我的 时间处理上可以更优化,但是我想不出来,先放一放吧。
刚做完,他说让我消化一下,然后直接又甩一个新题过来。啊。