zoukankan      html  css  js  c++  java
  • JAVA RSA加密解决及数字签名实现代码

    1、代码

    package com.zhaochao.utill;
    import java.security.Key;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.crypto.Cipher;
    
    public class RSACoder {
    	public static final String KEY_ALGORITHM = "RSA";
    	public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
    	private static final String PUBLIC_KEY = "RSAPublicKey";
    	private static final String PRIVATE_KEY = "RSAPrivateKey";
    
    	public static String sign(byte[] data, String privateKey) throws Exception {
    		// 解密由base64编码的私钥
    		byte[] keyBytes = decryptBASE64(privateKey);
    		// 构造PKCS8EncodedKeySpec对象
    		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    		// KEY_ALGORITHM 指定的加密算法
    		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    		// 取私钥匙对象
    		PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
    		// 用私钥对信息生成数字签名
    		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
    		signature.initSign(priKey);
    		signature.update(data);
    		return encryptBASE64(signature.sign());
    	}
    
    	public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
    		// 解密由base64编码的公钥
    		byte[] keyBytes = decryptBASE64(publicKey);
    		// 构造X509EncodedKeySpec对象
    		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
    		// KEY_ALGORITHM 指定的加密算法
    		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    		// 取公钥匙对象
    		PublicKey pubKey = keyFactory.generatePublic(keySpec);
    		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
    		signature.initVerify(pubKey);
    		signature.update(data);
    		// 验证签名是否正常
    		return signature.verify(decryptBASE64(sign));
    	}
    
    	public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
    		// 对密钥解密
    		byte[] keyBytes = decryptBASE64(key);
    		// 取得私钥
    		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    		Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    		// 对数据解密
    		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    		cipher.init(Cipher.DECRYPT_MODE, privateKey);
    		return cipher.doFinal(data);
    	}
    
    	public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
    		// 对密钥解密
    		byte[] keyBytes = decryptBASE64(key);
    		// 取得公钥
    		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
    		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    		Key publicKey = keyFactory.generatePublic(x509KeySpec);
    		// 对数据解密
    		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    		cipher.init(Cipher.DECRYPT_MODE, publicKey);
    		return cipher.doFinal(data);
    	}
    
    	public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
    		// 对公钥解密
    		byte[] keyBytes = decryptBASE64(key);
    		// 取得公钥
    		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
    		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    		Key publicKey = keyFactory.generatePublic(x509KeySpec);
    		// 对数据加密
    		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    		return cipher.doFinal(data);
    	}
    
    	public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
    		// 对密钥解密
    		byte[] keyBytes = decryptBASE64(key);
    		// 取得私钥
    		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    		Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    		// 对数据加密
    		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    		return cipher.doFinal(data);
    	}
    
    	private static byte[] decryptBASE64(String key) throws Exception {
    		// TODO Auto-generated method stub
    		return Base64Utill.decodeBase64(key);
    	}
    
    	public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
    		Key key = (Key) keyMap.get(PRIVATE_KEY);
    		return encryptBASE64(key.getEncoded());
    	}
    
    	private static String encryptBASE64(byte[] encoded) throws Exception {
    		// TODO Auto-generated method stub
    		return Base64Utill.encodeBase64(encoded);
    	}
    
    	public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
    		Key key = (Key) keyMap.get(PUBLIC_KEY);
    		return encryptBASE64(key.getEncoded());
    	}
    
    	public static Map<String, Object> initKey() throws Exception {
    		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
    		keyPairGen.initialize(1024);
    		KeyPair keyPair = keyPairGen.generateKeyPair();
    		// 公钥
    		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    		// 私钥
    		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    		Map<String, Object> keyMap = new HashMap<String, Object>(2);
    		keyMap.put(PUBLIC_KEY, publicKey);
    		keyMap.put(PRIVATE_KEY, privateKey);
    		return keyMap;
    	}
    
    	public static void testEncode(String publicKey, String privateKey) throws Exception {
    		System.err.println("公钥加密——私钥解密");
    		String inputStr = "abc";
    		byte[] data = inputStr.getBytes();
    		byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);
    		byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData, privateKey);
    		String outputStr = new String(decodedData);
    		System.err.println("加密前: " + inputStr);
    		System.err.println("加密后:" + new String(encodedData));
    		System.err.println("解密后:" + outputStr);
    		System.err.println(inputStr.equals(outputStr));
    
    
    	}
    
    	public static void testSign(String publicKey, String privateKey) throws Exception {
    		System.err.println("私钥加密——公钥解密");
    		String inputStr = "sign";
    		byte[] data = inputStr.getBytes();
    		byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);
    		byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);
    		String outputStr = new String(decodedData);
    		System.err.println("加密前: " + inputStr + "==" + "解密后: " + outputStr);
    		System.err.println(inputStr.equals(outputStr));
    		System.err.println("私钥签名——公钥验证签名");
    		// 产生签名
    		String sign = RSACoder.sign(encodedData, privateKey);
    		System.err.println("签名:" + sign);
    		// 验证签名
    		boolean status = RSACoder.verify(encodedData, publicKey, sign);
    		System.err.println("状态:" + status);
    
    
    	}
    
    	public static void main(String[] rags) throws Exception {
    		Map<String, Object> keyMap = RSACoder.initKey();
    		String publicKey = RSACoder.getPublicKey(keyMap);
    		String privateKey = RSACoder.getPrivateKey(keyMap);
    		System.err.println("公钥: nr" + publicKey);
    		System.err.println("私钥: nr" + privateKey);
    		testEncode(publicKey, privateKey);
    		testSign(publicKey, privateKey);
    
    	}
    
    }

    2、BASE64加密文章

    3、测试结果

    公钥: nrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcL1QiqQi6cR7FN61u8JxZrGuHUhQcCd5xinbLYRjLuriA1OY3SqnnUZAJQ7xQSIyPhufX7DjZTUqIux9RxSHsoOUPglxqLPudp4bXrVmICXiTeX7XlqlEJ3iBMIbWd9QXWfi9j6awX/8rBkssgnL7rVvYcJxqUN/6iMbRP6L0GQIDAQAB
    私钥: nrMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJwvVCKpCLpxHsU3rW7wnFmsa4dSFBwJ3nGKdsthGMu6uIDU5jdKqedRkAlDvFBIjI+G59fsONlNSoi7H1HFIeyg5Q+CXGos+52nhtetWYgJeJN5fteWqUQneIEwhtZ31BdZ+L2PprBf/ysGSyyCcvutW9hwnGpQ3/qIxtE/ovQZAgMBAAECgYBrMSRqYV7HLunyawMSF/sGpIpsJk387F0JygE8FljBQlZsvTF/kzPGubjEUwPEifZGb01haROfOCfGbb7SDRz5SvRK+O5+id7m9jxssqE0RaneWn+DPgaqiuVjHUFdYCYQpz9LrZvleennMZcT4v82jqrj7wS095e36L1uA7hrcQJBAMtwNVTt5VPNA8jV/VQQ7d9vTyHa2eBM5Ndz/tb+LCi7tEs/C/qiuPTnNaILS7J0O+3dCxBV2+JgelIjpesXTQ0CQQDEibB9xs8ntK1/zg0JkAx5VHsKrLHl3OyLiNT0AtMzJbNaIJMQh7bAiGxBt6X5Dahfn9gMWaJvipizl+PX9fg9AkEAhuEnSt7LTAtCNhbCdckfnSMUaRLLn237z2klje9I4dzJRZZQX+UhEaZ1pbEth+yOiz8hhbwXI/jpQKpH6B0zxQJBAMAxRX455GoXrXLFtModK5Wan5gYuP7nxAnPjS/xc0cZHwKLyETp8jTlM7gwNwYN7RFV5phtLwOUrS8y4YRW7KECQG/fO2HsWmZf/iF9sUa5lCeqt9KjHTQMmFC7j7ktaWuwXeqx27to/JfPe3kU0CWwWsKTrBYLYcY1ClM/za+yuuU=
    公钥加密——私钥解密
    加密前: abc
    加密后:?"]Tރ���7��iJ����Cc�[ɠ�,��C�~EQ^w�\_B�S��M���r�S'ڲl7Z1��L��T�E��7�T�_�l%ѭ�L�|f��k��c�p,r��w�A
    ]�1U���Q|�
    解密后:abc
    true
    私钥加密——公钥解密
    加密前: sign==解密后: sign
    true
    私钥签名——公钥验证签名
    签名:c4s5fSVDa6IrEIamAuJ5MxPADq7xsvJ5sVR3KguTLxWfsGZKTS4fCh01neiqZuRB/0e0d6n++cdDNwVwYrR6DQHINg2Uv3Y8mMzG0Sp/EnJAjqRmOP/b2kkIzAAS/UEuEdPLFSLex9cvVggdRK9V57XEeO0f7Qy7qaEcz+JmAZs=
    状态:true
    


  • 相关阅读:
    19.1.25 [LeetCode8]String to Integer (atoi)
    19.1.23 CJK Round 1A 2015
    19.1.22 CJK Qualification Round 2015
    【转载】超级弹丸论破2再见绝望学园攻略
    19.1.20 [LeetCode 7]Reverse Integer
    19.1.20 [LeetCode 6]ZigZag Conversion
    19.1.20 [LeetCode 5]Longest Palindromic Substring
    python socket-select io多路复用
    web框架 源码
    python socket
  • 原文地址:https://www.cnblogs.com/whzhaochao/p/5023415.html
Copyright © 2011-2022 走看看