1 import org.apache.commons.codec.binary.Base64; 2 3 import javax.crypto.Cipher; 4 import java.security.*; 5 import java.security.spec.PKCS8EncodedKeySpec; 6 import java.security.spec.X509EncodedKeySpec; 7 import java.util.HashMap; 8 import java.util.Map; 9 10 /** 11 * RSA加密和解密工具 12 * 13 * @Author: syj 14 * @CreateDate: 2018/7/20 16:52 15 */ 16 public class RSAUtil { 17 18 /** 19 * 数字签名,密钥算法 20 */ 21 private static final String RSA_KEY_ALGORITHM = "RSA"; 22 23 /** 24 * 数字签名签名/验证算法 25 */ 26 private static final String SIGNATURE_ALGORITHM = "MD5withRSA"; 27 28 /** 29 * RSA密钥长度,RSA算法的默认密钥长度是1024密钥长度必须是64的倍数,在512到65536位之间 30 */ 31 private static final int KEY_SIZE = 1024; 32 33 /** 34 * 生成密钥对 35 */ 36 private static Map<String, String> initKey() throws Exception { 37 KeyPairGenerator keygen = KeyPairGenerator.getInstance(RSA_KEY_ALGORITHM); 38 SecureRandom secrand = new SecureRandom(); 39 /** 40 * 初始化随机产生器 41 */ 42 secrand.setSeed("initSeed".getBytes()); 43 /** 44 * 初始化密钥生成器 45 */ 46 keygen.initialize(KEY_SIZE, secrand); 47 KeyPair keys = keygen.genKeyPair(); 48 49 byte[] pub_key = keys.getPublic().getEncoded(); 50 String publicKeyString = Base64.encodeBase64String(pub_key); 51 52 byte[] pri_key = keys.getPrivate().getEncoded(); 53 String privateKeyString = Base64.encodeBase64String(pri_key); 54 55 Map<String, String> keyPairMap = new HashMap<>(); 56 keyPairMap.put("publicKeyString", publicKeyString); 57 keyPairMap.put("privateKeyString", privateKeyString); 58 59 return keyPairMap; 60 } 61 62 /** 63 * 密钥转成字符串 64 * 65 * @param key 66 * @return 67 */ 68 public static String encodeBase64String(byte[] key) { 69 return Base64.encodeBase64String(key); 70 } 71 72 /** 73 * 密钥转成byte[] 74 * 75 * @param key 76 * @return 77 */ 78 public static byte[] decodeBase64(String key) { 79 return Base64.decodeBase64(key); 80 } 81 82 /** 83 * 公钥加密 84 * 85 * @param data 加密前的字符串 86 * @param publicKey 公钥 87 * @return 加密后的字符串 88 * @throws Exception 89 */ 90 public static String encryptByPubKey(String data, String publicKey) throws Exception { 91 byte[] pubKey = RSAUtil.decodeBase64(publicKey); 92 byte[] enSign = encryptByPubKey(data.getBytes(), pubKey); 93 return Base64.encodeBase64String(enSign); 94 } 95 96 /** 97 * 公钥加密 98 * 99 * @param data 待加密数据 100 * @param pubKey 公钥 101 * @return 102 * @throws Exception 103 */ 104 public static byte[] encryptByPubKey(byte[] data, byte[] pubKey) throws Exception { 105 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey); 106 KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); 107 PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); 108 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 109 cipher.init(Cipher.ENCRYPT_MODE, publicKey); 110 return cipher.doFinal(data); 111 } 112 113 /** 114 * 私钥加密 115 * 116 * @param data 加密前的字符串 117 * @param privateKey 私钥 118 * @return 加密后的字符串 119 * @throws Exception 120 */ 121 public static String encryptByPriKey(String data, String privateKey) throws Exception { 122 byte[] priKey = RSAUtil.decodeBase64(privateKey); 123 byte[] enSign = encryptByPriKey(data.getBytes(), priKey); 124 return Base64.encodeBase64String(enSign); 125 } 126 127 /** 128 * 私钥加密 129 * 130 * @param data 待加密的数据 131 * @param priKey 私钥 132 * @return 加密后的数据 133 * @throws Exception 134 */ 135 public static byte[] encryptByPriKey(byte[] data, byte[] priKey) throws Exception { 136 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey); 137 KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); 138 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); 139 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 140 cipher.init(Cipher.ENCRYPT_MODE, privateKey); 141 return cipher.doFinal(data); 142 } 143 144 /** 145 * 公钥解密 146 * 147 * @param data 待解密的数据 148 * @param pubKey 公钥 149 * @return 解密后的数据 150 * @throws Exception 151 */ 152 public static byte[] decryptByPubKey(byte[] data, byte[] pubKey) throws Exception { 153 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey); 154 KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); 155 PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); 156 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 157 cipher.init(Cipher.DECRYPT_MODE, publicKey); 158 return cipher.doFinal(data); 159 } 160 161 /** 162 * 公钥解密 163 * 164 * @param data 解密前的字符串 165 * @param publicKey 公钥 166 * @return 解密后的字符串 167 * @throws Exception 168 */ 169 public static String decryptByPubKey(String data, String publicKey) throws Exception { 170 byte[] pubKey = RSAUtil.decodeBase64(publicKey); 171 byte[] design = decryptByPubKey(Base64.decodeBase64(data), pubKey); 172 return new String(design); 173 } 174 175 /** 176 * 私钥解密 177 * 178 * @param data 待解密的数据 179 * @param priKey 私钥 180 * @return 181 * @throws Exception 182 */ 183 public static byte[] decryptByPriKey(byte[] data, byte[] priKey) throws Exception { 184 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey); 185 KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); 186 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); 187 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 188 cipher.init(Cipher.DECRYPT_MODE, privateKey); 189 return cipher.doFinal(data); 190 } 191 192 /** 193 * 私钥解密 194 * 195 * @param data 解密前的字符串 196 * @param privateKey 私钥 197 * @return 解密后的字符串 198 * @throws Exception 199 */ 200 public static String decryptByPriKey(String data, String privateKey) throws Exception { 201 byte[] priKey = RSAUtil.decodeBase64(privateKey); 202 byte[] design = decryptByPriKey(Base64.decodeBase64(data), priKey); 203 return new String(design); 204 } 205 206 /** 207 * RSA签名 208 * 209 * @param data 待签名数据 210 * @param priKey 私钥 211 * @return 签名 212 * @throws Exception 213 */ 214 public static String sign(byte[] data, byte[] priKey) throws Exception { 215 // 取得私钥 216 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey); 217 KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); 218 // 生成私钥 219 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); 220 // 实例化Signature 221 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); 222 // 初始化Signature 223 signature.initSign(privateKey); 224 // 更新 225 signature.update(data); 226 return Base64.encodeBase64String(signature.sign()); 227 } 228 229 /** 230 * RSA校验数字签名 231 * 232 * @param data 待校验数据 233 * @param sign 数字签名 234 * @param pubKey 公钥 235 * @return boolean 校验成功返回true,失败返回false 236 */ 237 public boolean verify(byte[] data, byte[] sign, byte[] pubKey) throws Exception { 238 // 实例化密钥工厂 239 KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); 240 // 初始化公钥 241 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey); 242 // 产生公钥 243 PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); 244 // 实例化Signature 245 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); 246 // 初始化Signature 247 signature.initVerify(publicKey); 248 // 更新 249 signature.update(data); 250 // 验证 251 return signature.verify(sign); 252 } 253 254 public static void main(String[] args) { 255 try { 256 Map<String, String> keyMap = initKey(); 257 String publicKeyString = keyMap.get("publicKeyString"); 258 String privateKeyString = keyMap.get("privateKeyString"); 259 System.out.println("公钥:" + publicKeyString); 260 System.out.println("私钥:" + privateKeyString); 261 262 // 待加密数据 263 String data = "admin123"; 264 // 公钥加密 265 String encrypt = RSAUtil.encryptByPubKey(data, publicKeyString); 266 // 私钥解密 267 String decrypt = RSAUtil.decryptByPriKey(encrypt, privateKeyString); 268 269 System.out.println("加密前:" + data); 270 System.out.println("加密后:" + encrypt); 271 System.out.println("解密后:" + decrypt); 272 } catch (Exception e) { 273 e.printStackTrace(); 274 } 275 } 276 277 }