首页 > 代码库 > RSA非对称加密Java实现
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 * @return100 * @throws Exception101 */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 * @return119 * @throws Exception120 */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 * @return137 * @throws Exception138 */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 * @return160 * @throws Exception161 */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: main180 * @Description: 测试181 * @param @param args182 * @return void183 * @throws184 */185 public static void main(String[] args) {186 try {187 Map<String,Key> data =http://www.mamicode.com/ 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 加密前:JavaRsaEncoder2 加密后:l+vhbdRdq3dc5nr6m4jSIuW0ufKeCYBw4ds2Es9/SmPa/Dp298gZsT8KkZRwlKcm60+MV67fVMyG3 OgwCZWbqQqmu8Mr+ZuqUWWnIZ0fIi1JAaqiwqsg7SaIkvixU35HHdsxmNMdK+1qPDWBE5sCjSCJ+4 xaG0Y8BOpyGDlpL9bOc=5 解密后:JavaRsaEncoder
RSA非对称加密Java实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。