【PKI】2.keytool产生 RSA密钥对,做签名

【PKI】2.keytool产生 RSA密钥对,做签名

导师邮件:上个程序基本搞差不多了,再继续做个练习:用java的 keytool 命令行产生一个rsa 2048 密钥的jks,然后通过程序使用jks里的密钥做签名。

分析:  功能实现分两步骤==>使用keytool命令行 生成 密钥对(可以接着产生证书、公钥、私钥),将密钥读入程序,并做签名

首先,使用keytool 产生 RSA 2048 密钥对,

然后,在程序中读入密钥文件,获取私钥,

最后,对数据进行签名,

附加,完成验签

——————————————————

1. 使用keytool 产生 RSA 2048 密钥对,

1.1 SHA256WithRSA生成密钥

keytool -genkey -v -alias rsa0 -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore rsa0.keystore

1.2 MD5WithRSA生成密钥

keytool -genkey -v -alias rsa1 -keyalg RSA -sigalg MD5withRSA -keysize 2048 -storetype PKCS12 -keystore rsa1.keystore

按指导完成证书条目的生成,生成keystore文件。

/* 之前的写法:

       keytool -genkey -v -alias rsa -keyalg RSA -keysize 2048 -keystore rsa.store -validity 10000

将 证书条码迁移 到 pkcs12 标准:

       keytool -importkeystore -srckeystore rsa.store -destkeystore rsa.store -deststoretype pkcs12

*/ 

2. 在程序中读入密钥文件,获取私钥,对数据进行签名,完成验签

package work_2;
 
import java.io.FileInputStream;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
 
import sun.misc.BASE64Encoder;
 
public class RSA_2 {
	// 待签名数据
	public static  String  src = "12345678";
	 public static void main(String[] args) throws Exception{ 
		    // 1. 指定 jks 文件的位置
	        String keyStoreType = "jks";
	        String keystoreFile = "E:\\1_Project\\1_Eclipse\\2_Test\\rsa.keystore";
	        
	        // 2. keystore 的密码 和 条目的密码
	        String password = "Infosec"; 			
	        String friendPassword = "Infosec";		
	       
	        // 3. 加载文件,通过密码验证
	        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
	        keyStore.load(new FileInputStream(keystoreFile), password.toCharArray());
 
	        String alias = "rsa";//条目别名
	       
	        // 4. 导出 公钥 私钥
	        KeyPair keyPair = ExportCert.getKeyPair(keyStore, alias, friendPassword.toCharArray()); 
	        
	        byte[] privateKeyByte = keyPair.getPrivate().getEncoded(); // 私钥
	        byte[] publicKeyByte = keyPair.getPublic().getEncoded();  // 公钥
	        
	        String privateKeyString = new BASE64Encoder().encode(privateKeyByte);
	        String publicKeyString = new BASE64Encoder().encode(publicKeyByte);
	        
	      // System.out.println("privateKeyString的长度为:"+privateKeyString.length());
	      // System.out.println(privateKeyString);
	        
	      // System.out.println("publicKeyString的长度为:"+publicKeyString.length());
	      // System.out.println(publicKeyString);
	        
	        // 5. 完成签名处理
	        byte[] sign = sign(keyPair.getPrivate());
	        
	        // 6. 签名验签处理
	        verity(keyPair.getPublic(),sign);
	   }
	 
	 // 1. 得到密钥对 KeyPair
	 public static KeyPair getKeyPair(KeyStore keyStore, String alias, char[] password){
	     try{
	         Key key = keyStore.getKey(alias, password);
	         if (key instanceof PrivateKey){
	             Certificate certificate = keyStore.getCertificate(alias);
	             PublicKey publicKey = certificate.getPublicKey();
	             return new KeyPair(publicKey, (PrivateKey) key);
	         }
	     }catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException e){
	         e.printStackTrace();
	     }
	     return null;
	 } 
	// 2. 做签名,并返回
	 public static byte[] sign(PrivateKey privateKey) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException{
		 // 1. 选择 签名算法
		 Signature signature = Signature.getInstance("MD5WithRSA");
		 // 2. 初始化 私钥
		 signature.initSign(privateKey);
		 // 3. 更新 要签名的数据
		 signature.update(src.getBytes());
		 // 4. 签名,并发挥签名
		 byte[] signByte = signature.sign();
		 return signByte; 
	 }
	 
	 // 3. 验签
	 public static void verity(PublicKey publicKey,byte[] sign) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException{
		 // 1. 选择 验签算法	 
		 Signature signature = Signature.getInstance("MD5WithRSA");
		 // 2. 初始化公钥
		 signature.initVerify(publicKey);
		 // 3. 更新 要验证的 数据
		 signature.update(src.getBytes());
		 // 4. 验证处理   (signature 中保存着 更新过的src,通过verify 处理原文得到,签名和之前的签名对比)
		 				//	(此处留有疑问,特别是对于update的具体实现细节)
		 boolean flag = signature.verify(sign);
		 // 5. 输出  验证结果
		 System.out.println("经过验证发现,签名是:"+ flag);
	 }
}

输出结果:

完成基本功能实现,现在发给 导师。

记录一下:

CMD生成 密钥

1. keytool -genkeypair -alias "test1" -keyalg "RSA" -keystore "test.keystore"  

2.keytool -importkeystore -srckeystore test.keystore -destkeystore test.keystore -deststoretype pkcs12

3. keytool -genkey -v -alias rsa -keyalg RSA -keysize 2048 -keystore rsa.store -validity 10000

SHA256WithRSA生成密钥

4. keytool -genkey -v -alias rsa -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore rsa.keystore  -dname "CN=www.infosec.com,OU=infosec,O=infosec,L=bj,ST=bj,C=cn" -storepass Infosec -keypass Infosec

使用 MD5WithRSA生成密钥

5. keytool -genkey -v -alias rsa2 -keyalg RSA -sigalg MD5withRSA -keysize 2048 -storetype PKCS12 -keystore rsa2.keystore -dname "CN=www.infosec.com,OU=infosec,O=infosec,L=bj,ST=bj,C=cn" -storepass Infosec -keypass Infosec

over…

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