首页 > 代码库 > 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实现