RSACoder.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package com.mixsmart.security;
  2. import javax.crypto.Cipher;
  3. import java.security.*;
  4. import java.security.interfaces.RSAPrivateKey;
  5. import java.security.interfaces.RSAPublicKey;
  6. import java.security.spec.PKCS8EncodedKeySpec;
  7. import java.security.spec.X509EncodedKeySpec;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * RSA安全编码组件
  12. *
  13. * @version 1.0
  14. * @since 1.0
  15. */
  16. public abstract class RSACoder extends Coder{
  17. public static final String KEY_ALGORITHM = "RSA";
  18. public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
  19. private static final String PUBLIC_KEY = "RSAPublicKey";
  20. private static final String PRIVATE_KEY = "RSAPrivateKey";
  21. /**
  22. * 用私钥对信息生成数字签名
  23. *
  24. * @param data
  25. * 加密数据
  26. * @param privateKey
  27. * 私钥
  28. *
  29. * @return 返回数字签名
  30. * @throws Exception
  31. */
  32. public static String sign(byte[] data, String privateKey) throws Exception {
  33. // 解密由base64编码的私钥
  34. byte[] keyBytes = decryptBASE64(privateKey);
  35. // 构造PKCS8EncodedKeySpec对象
  36. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  37. // KEY_ALGORITHM 指定的加密算法
  38. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  39. // 取私钥匙对象
  40. PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
  41. // 用私钥对信息生成数字签名
  42. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  43. signature.initSign(priKey);
  44. signature.update(data);
  45. return encryptBASE64(signature.sign());
  46. }
  47. /**
  48. * 校验数字签名
  49. *
  50. * @param data
  51. * 加密数据
  52. * @param publicKey
  53. * 公钥
  54. * @param sign
  55. * 数字签名
  56. *
  57. * @return 校验成功返回true 失败返回false
  58. * @throws Exception
  59. *
  60. */
  61. public static boolean verify(byte[] data, String publicKey, String sign)
  62. throws Exception {
  63. // 解密由base64编码的公钥
  64. byte[] keyBytes = decryptBASE64(publicKey);
  65. // 构造X509EncodedKeySpec对象
  66. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  67. // KEY_ALGORITHM 指定的加密算法
  68. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  69. // 取公钥匙对象
  70. PublicKey pubKey = keyFactory.generatePublic(keySpec);
  71. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  72. signature.initVerify(pubKey);
  73. signature.update(data);
  74. // 验证签名是否正常
  75. return signature.verify(decryptBASE64(sign));
  76. }
  77. /**
  78. * 解密<br>
  79. * 用私钥解密
  80. * @param data
  81. * @param key
  82. * @return 返回字节数组
  83. * @throws Exception
  84. */
  85. public static byte[] decryptByPrivateKey(byte[] data, String key)
  86. throws Exception {
  87. // 对密钥解密
  88. byte[] keyBytes = decryptBASE64(key);
  89. // 取得私钥
  90. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  91. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  92. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  93. // 对数据解密
  94. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  95. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  96. return cipher.doFinal(data);
  97. }
  98. /**
  99. * 解密<br>
  100. * 用私钥解密
  101. *
  102. * @param data
  103. * @param key
  104. * @return 返回字节数组
  105. * @throws Exception
  106. */
  107. public static byte[] decryptByPublicKey(byte[] data, String key)
  108. throws Exception {
  109. // 对密钥解密
  110. byte[] keyBytes = decryptBASE64(key);
  111. // 取得公钥
  112. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  113. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  114. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  115. // 对数据解密
  116. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  117. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  118. return cipher.doFinal(data);
  119. }
  120. /**
  121. * 加密<br>
  122. * 用公钥加密
  123. *
  124. * @param data
  125. * @param key
  126. * @return 返回字节数组
  127. * @throws Exception
  128. */
  129. public static byte[] encryptByPublicKey(byte[] data, String key)
  130. throws Exception {
  131. // 对公钥解密
  132. byte[] keyBytes = decryptBASE64(key);
  133. // 取得公钥
  134. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  135. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  136. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  137. // 对数据加密
  138. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  139. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  140. return cipher.doFinal(data);
  141. }
  142. /**
  143. * 加密<br>
  144. * 用私钥加密
  145. *
  146. * @param data
  147. * @param key
  148. * @return 返回字节数组
  149. * @throws Exception
  150. */
  151. public static byte[] encryptByPrivateKey(byte[] data, String key)
  152. throws Exception {
  153. // 对密钥解密
  154. byte[] keyBytes = decryptBASE64(key);
  155. // 取得私钥
  156. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  157. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  158. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  159. // 对数据加密
  160. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  161. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  162. return cipher.doFinal(data);
  163. }
  164. /**
  165. * 取得私钥
  166. *
  167. * @param keyMap
  168. * @return 返回私钥
  169. * @throws Exception
  170. */
  171. public static String getPrivateKey(Map<String, Object> keyMap)
  172. throws Exception {
  173. Key key = (Key) keyMap.get(PRIVATE_KEY);
  174. return encryptBASE64(key.getEncoded());
  175. }
  176. /**
  177. * 取得公钥
  178. *
  179. * @param keyMap
  180. * @return 返回公钥
  181. * @throws Exception
  182. */
  183. public static String getPublicKey(Map<String, Object> keyMap)
  184. throws Exception {
  185. Key key = (Key) keyMap.get(PUBLIC_KEY);
  186. return encryptBASE64(key.getEncoded());
  187. }
  188. /**
  189. * 初始化密钥
  190. *
  191. * @return 返回初始化密钥
  192. * @throws Exception
  193. */
  194. public static Map<String, Object> initKey() throws Exception {
  195. KeyPairGenerator keyPairGen = KeyPairGenerator
  196. .getInstance(KEY_ALGORITHM);
  197. keyPairGen.initialize(1024);
  198. KeyPair keyPair = keyPairGen.generateKeyPair();
  199. // 公钥
  200. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  201. // 私钥
  202. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
  203. Map<String, Object> keyMap = new HashMap<String, Object>(2);
  204. keyMap.put(PUBLIC_KEY, publicKey);
  205. keyMap.put(PRIVATE_KEY, privateKey);
  206. return keyMap;
  207. }
  208. }