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
原文地址:https://www.cnblogs.com/libaoting/p/4108680.html