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

 

你可能感兴趣的:(java实现)