RSA非对称加密Java实现
加密基础方法类
1 import java.security.MessageDigest; 2 import sun.misc.BASE64Decoder; 3 import sun.misc.BASE64Encoder; 4 public class SecurityBase { 5 public static final String KEY_SHA="SHA"; 6 public static final String KEY_MD5="MD5"; 7 //BASE64解密 8 public static byte[] decryptBASE64(String key) throws Exception{ 9 return (new BASE64Decoder()).decodeBuffer(key); 10 } 11 //BASE64加密 12 public static String encryptBASE64(byte[] key)throws Exception{ 13 return (new BASE64Encoder()).encodeBuffer(key); 14 } 15 //MD5加密 16 public static byte[] encryptMD5(byte[] data)throws Exception{ 17 MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); 18 md5.update(data); 19 return md5.digest(); 20 } 21 //SHA加密 22 public static byte[] encryptSHA(byte[] data)throws Exception{ 23 MessageDigest sha = MessageDigest.getInstance(KEY_SHA); 24 sha.update(data); 25 return sha.digest(); 26 } 27 }
RSA非对称加密实现类
1 import java.security.Key; 2 import java.security.KeyFactory; 3 import java.security.KeyPair; 4 import java.security.KeyPairGenerator; 5 import java.security.PrivateKey; 6 import java.security.PublicKey; 7 import java.security.Signature; 8 import java.security.interfaces.RSAPrivateKey; 9 import java.security.interfaces.RSAPublicKey; 10 import java.security.spec.PKCS8EncodedKeySpec; 11 import java.security.spec.X509EncodedKeySpec; 12 import java.util.HashMap; 13 import java.util.Map; 14 import javax.crypto.Cipher; 15 public class RSASecurity extends SecurityBase { 16 public static final String KEY_ALGORTHM="RSA"; 17 public static final String SIGNATURE_ALGORITHM="MD5withRSA"; 18 public static final String PUBLIC_KEY = "RSAPublicKey";//公钥 19 public static final String PRIVATE_KEY = "RSAPrivateKey";//私钥 20 /** 21 * 初始化密钥 22 * @return 23 * @throws Exception 24 */ 25 public static Map<String,Key> createKeys()throws Exception{ 26 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM); 27 keyPairGenerator.initialize(1024); 28 KeyPair keyPair = keyPairGenerator.generateKeyPair(); 29 //公钥 30 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); 31 //私钥 32 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); 33 Map<String,Key> keyMap = new HashMap<String, Key>(2); 34 keyMap.put(PUBLIC_KEY, publicKey); 35 keyMap.put(PRIVATE_KEY, privateKey); 36 return keyMap; 37 } 38 /** 39 * 取得公钥,并转化为String类型 40 * @param keyMap 41 * @return 42 * @throws Exception 43 */ 44 public static String getPublicKey(Map<String, Key> keyMap)throws Exception{ 45 Key key = keyMap.get(PUBLIC_KEY); 46 return encryptBASE64(key.getEncoded()); 47 } 48 /** 49 * 取得私钥,并转化为String类型 50 * @param keyMap 51 * @return 52 * @throws Exception 53 */ 54 public static String getPrivateKey(Map<String, Key> keyMap) throws Exception{ 55 Key key = keyMap.get(PRIVATE_KEY); 56 return encryptBASE64(key.getEncoded()); 57 } 58 /** 59 * 用私钥加密 60 * @param data 加密数据 61 * @param key 密钥 62 * @return 63 * @throws Exception 64 */ 65 public static byte[] encryptByPrivateKey(byte[] data,String key)throws Exception{ 66 //解密密钥 67 byte[] keyBytes = decryptBASE64(key); 68 //取私钥 69 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); 70 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); 71 Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); 72 //对数据加密 73 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 74 cipher.init(Cipher.ENCRYPT_MODE, privateKey); 75 return cipher.doFinal(data); 76 } 77 /** 78 * 用私钥解密 79 * @param data 加密数据 80 * @param key 密钥 81 * @return 82 * @throws Exception 83 */ 84 public static byte[] decryptByPrivateKey(byte[] data,String key)throws Exception{ 85 //对私钥解密 86 byte[] keyBytes = decryptBASE64(key); 87 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); 88 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); 89 Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); 90 //对数据解密 91 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 92 cipher.init(Cipher.DECRYPT_MODE, privateKey); 93 return cipher.doFinal(data); 94 } 95 /** 96 * 用公钥加密 97 * @param data 加密数据 98 * @param key 密钥 99 * @return 100 * @throws Exception 101 */ 102 public static byte[] encryptByPublicKey(byte[] data,String key)throws Exception{ 103 //对公钥解密 104 byte[] keyBytes = decryptBASE64(key); 105 //取公钥 106 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); 107 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); 108 Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec); 109 //对数据解密 110 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 111 cipher.init(Cipher.ENCRYPT_MODE, publicKey); 112 return cipher.doFinal(data); 113 } 114 /** 115 * 用公钥解密 116 * @param data 加密数据 117 * @param key 密钥 118 * @return 119 * @throws Exception 120 */ 121 public static byte[] decryptByPublicKey(byte[] data,String key)throws Exception{ 122 //对私钥解密 123 byte[] keyBytes = decryptBASE64(key); 124 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); 125 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); 126 Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec); 127 //对数据解密 128 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 129 cipher.init(Cipher.DECRYPT_MODE, publicKey); 130 return cipher.doFinal(data); 131 } 132 /** 133 * 用私钥对信息生成数字签名 134 * @param data //加密数据 135 * @param privateKey //私钥 136 * @return 137 * @throws Exception 138 */ 139 public static String sign(byte[] data,String privateKey)throws Exception{ 140 //解密私钥 141 byte[] keyBytes = decryptBASE64(privateKey); 142 //构造PKCS8EncodedKeySpec对象 143 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); 144 //指定加密算法 145 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); 146 //取私钥匙对象 147 PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec); 148 //用私钥对信息生成数字签名 149 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); 150 signature.initSign(privateKey2); 151 signature.update(data); 152 return encryptBASE64(signature.sign()); 153 } 154 /** 155 * 校验数字签名 156 * @param data 加密数据 157 * @param publicKey 公钥 158 * @param sign 数字签名 159 * @return 160 * @throws Exception 161 */ 162 public static boolean verify(byte[] data,String publicKey,String sign)throws Exception{ 163 //解密公钥 164 byte[] keyBytes = decryptBASE64(publicKey); 165 //构造X509EncodedKeySpec对象 166 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); 167 //指定加密算法 168 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); 169 //取公钥匙对象 170 PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec); 171 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); 172 signature.initVerify(publicKey2); 173 signature.update(data); 174 //验证签名是否正常 175 return signature.verify(decryptBASE64(sign)); 176 } 177 /** 178 * 179 * @Title: main 180 * @Description: 测试 181 * @param @param args 182 * @return void 183 * @throws 184 */ 185 public static void main(String[] args) { 186 try { 187 Map<String,Key> data = createKeys(); 188 String content = "JavaRsaEncoder"; 189 System.out.println("加密前:"+content); 190 String encode = encryptBASE64(encryptByPrivateKey(content.getBytes(), getPrivateKey(data))); 191 System.out.println("加密后:"+encode); 192 String decode = new String(decryptByPublicKey(decryptBASE64(encode), getPublicKey(data))); 193 System.out.println("解密后:"+decode); 194 } catch (Exception e) { 195 e.printStackTrace(); 196 } 197 } 198 }
运行结果
1 加密前:JavaRsaEncoder 2 加密后:l+vhbdRdq3dc5nr6m4jSIuW0ufKeCYBw4ds2Es9/SmPa/Dp298gZsT8KkZRwlKcm60+MV67fVMyG 3 OgwCZWbqQqmu8Mr+ZuqUWWnIZ0fIi1JAaqiwqsg7SaIkvixU35HHdsxmNMdK+1qPDWBE5sCjSCJ+ 4 xaG0Y8BOpyGDlpL9bOc= 5 解密后:JavaRsaEncoder