常用的MD5、SHA1加密等。

    1. import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    2. import javax.crypto.Cipher;
    3. import javax.crypto.KeyGenerator;
    4. import javax.crypto.Mac;
    5. import javax.crypto.SecretKey;
    6. import javax.crypto.spec.SecretKeySpec;
    7. import java.security.MessageDigest;
    8. import java.security.SecureRandom;
    9. public class EncryptUtil {
    10. public static final String MD5 = "MD5";
    11. public static final String SHA1 = "SHA1";
    12. public static final String HmacMD5 = "HmacMD5";
    13. public static final String HmacSHA1 = "HmacSHA1";
    14. public static final String DES = "DES";
    15. public static final String AES = "AES";
    16. /**编码格式;默认使用uft-8*/
    17. public static String charset = "utf-8";
    18. /**DES*/
    19. public static int keysizeDES = 0;
    20. /**AES*/
    21. public static int keysizeAES = 128;
    22. public static EncryptUtil me;
    23. private EncryptUtil(){
    24. //单例
    25. }
    26. //双重锁
    27. public static EncryptUtil getInstance(){
    28. if (me==null) {
    29. synchronized (EncryptUtil.class) {
    30. if(me == null){
    31. me = new EncryptUtil();
    32. }
    33. }
    34. }
    35. return me;
    36. }
    37. /**
    38. * 使用MessageDigest进行单向加密(无密码)
    39. * @param res 被加密的文本
    40. * @param algorithm 加密算法名称
    41. * @return
    42. */
    43. private static String messageDigest(String res,String algorithm){
    44. try {
    45. MessageDigest md = MessageDigest.getInstance(algorithm);
    46. byte[] resBytes = charset==null?res.getBytes():res.getBytes(charset);
    47. return base64(md.digest(resBytes));
    48. } catch (Exception e) {
    49. e.printStackTrace();
    50. }
    51. return null;
    52. }
    53. /**
    54. * 使用KeyGenerator进行单向/双向加密(可设密码)
    55. * @param res 被加密的原文
    56. * @param algorithm 加密使用的算法名称
    57. * @param key 加密使用的秘钥
    58. * @return
    59. */
    60. private static String keyGeneratorMac(String res,String algorithm,String key){
    61. try {
    62. SecretKey sk = null;
    63. if (key==null) {
    64. KeyGenerator kg = KeyGenerator.getInstance(algorithm);
    65. sk = kg.generateKey();
    66. }else {
    67. byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);
    68. sk = new SecretKeySpec(keyBytes, algorithm);
    69. }
    70. Mac mac = Mac.getInstance(algorithm);
    71. mac.init(sk);
    72. byte[] result = mac.doFinal(res.getBytes());
    73. return base64(result);
    74. } catch (Exception e) {
    75. e.printStackTrace();
    76. }
    77. return null;
    78. }
    79. /**
    80. * 使用KeyGenerator双向加密,DES/AES,注意这里转化为字符串的时候是将2进制转为16进制格式的字符串,不是直接转,因为会出错
    81. * @param res 加密的原文
    82. * @param algorithm 加密使用的算法名称
    83. * @param key 加密的秘钥
    84. * @param keysize
    85. * @param isEncode
    86. * @return
    87. */
    88. private static String keyGeneratorES(String res,String algorithm,String key,int keysize,boolean isEncode){
    89. try {
    90. KeyGenerator kg = KeyGenerator.getInstance(algorithm);
    91. if (keysize == 0) {
    92. byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);
    93. kg.init(new SecureRandom(keyBytes));
    94. }else if (key==null) {
    95. kg.init(keysize);
    96. }else {
    97. byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);
    98. kg.init(keysize, new SecureRandom(keyBytes));
    99. }
    100. SecretKey sk = kg.generateKey();
    101. SecretKeySpec sks = new SecretKeySpec(sk.getEncoded(), algorithm);
    102. Cipher cipher = Cipher.getInstance(algorithm);
    103. if (isEncode) {
    104. cipher.init(Cipher.ENCRYPT_MODE, sks);
    105. byte[] resBytes = charset==null?res.getBytes():res.getBytes(charset);
    106. return parseByte2HexStr(cipher.doFinal(resBytes));
    107. }else {
    108. cipher.init(Cipher.DECRYPT_MODE, sks);
    109. return new String(cipher.doFinal(parseHexStr2Byte(res)));
    110. }
    111. } catch (Exception e) {
    112. e.printStackTrace();
    113. }
    114. return null;
    115. }
    116. private static String base64(byte[] res){
    117. return Base64.encode(res);
    118. }
    119. /**将二进制转换成16进制 */
    120. public static String parseByte2HexStr(byte buf[]) {
    121. StringBuffer sb = new StringBuffer();
    122. for (int i = 0; i < buf.length; i++) {
    123. String hex = Integer.toHexString(buf[i] & 0xFF);
    124. if (hex.length() == 1) {
    125. hex = '0' + hex;
    126. }
    127. sb.append(hex.toUpperCase());
    128. }
    129. return sb.toString();
    130. }
    131. /**将16进制转换为二进制*/
    132. public static byte[] parseHexStr2Byte(String hexStr) {
    133. if (hexStr.length() < 1) {
    134. return null;
    135. }
    136. byte[] result = new byte[hexStr.length()/2];
    137. for (int i = 0;i< hexStr.length()/2; i++) {
    138. int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
    139. int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
    140. result[i] = (byte) (high * 16 + low);
    141. }
    142. return result;
    143. }
    144. /**
    145. * md5加密算法进行加密(不可逆)
    146. * @param res 需要加密的原文
    147. * @return
    148. */
    149. public static String MD5(String res) {
    150. return messageDigest(res, MD5);
    151. }
    152. /**
    153. * md5加密算法进行加密(不可逆)
    154. * @param res 需要加密的原文
    155. * @param key 秘钥
    156. * @return
    157. */
    158. public static String MD5(String res, String key) {
    159. return keyGeneratorMac(res, HmacMD5, key);
    160. }
    161. /**
    162. * 使用SHA1加密算法进行加密(不可逆)
    163. * @param res 需要加密的原文
    164. * @return
    165. */
    166. public static String SHA1(String res) {
    167. return messageDigest(res, SHA1);
    168. }
    169. /**
    170. * 使用SHA1加密算法进行加密(不可逆)
    171. * @param res 需要加密的原文
    172. * @param key 秘钥
    173. * @return
    174. */
    175. public static String SHA1(String res, String key) {
    176. return keyGeneratorMac(res, HmacSHA1, key);
    177. }
    178. /**
    179. * 使用DES加密算法进行加密(可逆)
    180. * @param res 需要加密的原文
    181. * @param key 秘钥
    182. * @return
    183. */
    184. public static String DESencode(String res, String key) {
    185. return keyGeneratorES(res, DES, key, keysizeDES, true);
    186. }
    187. /**
    188. * 对使用DES加密算法的密文进行解密(可逆)
    189. * @param res 需要解密的密文
    190. * @param key 秘钥
    191. * @return
    192. */
    193. public static String DESdecode(String res, String key) {
    194. return keyGeneratorES(res, DES, key, keysizeDES, false);
    195. }
    196. /**
    197. * 使用AES加密算法经行加密(可逆)
    198. * @param res 需要加密的密文
    199. * @param key 秘钥
    200. * @return
    201. */
    202. public static String AESencode(String res, String key) {
    203. return keyGeneratorES(res, AES, key, keysizeAES, true);
    204. }
    205. /**
    206. * 对使用AES加密算法的密文进行解密
    207. * @param res 需要解密的密文
    208. * @param key 秘钥
    209. * @return
    210. */
    211. public static String AESdecode(String res, String key) {
    212. return keyGeneratorES(res, AES, key, keysizeAES, false);
    213. }
    214. /**
    215. * 使用异或进行加密
    216. * @param res 需要加密的密文
    217. * @param key 秘钥
    218. * @return
    219. */
    220. public static String XORencode(String res, String key) {
    221. byte[] bs = res.getBytes();
    222. for (int i = 0; i < bs.length; i++) {
    223. bs[i] = (byte) ((bs[i]) ^ key.hashCode());
    224. }
    225. return parseByte2HexStr(bs);
    226. }
    227. /**
    228. * 使用异或进行解密
    229. * @param res 需要解密的密文
    230. * @param key 秘钥
    231. * @return
    232. */
    233. public static String XORdecode(String res, String key) {
    234. byte[] bs = parseHexStr2Byte(res);
    235. for (int i = 0; i < bs.length; i++) {
    236. bs[i] = (byte) ((bs[i]) ^ key.hashCode());
    237. }
    238. return new String(bs);
    239. }
    240. /**
    241. * 直接使用异或(第一调用加密,第二次调用解密)
    242. * @param res 密文
    243. * @param key 秘钥
    244. * @return
    245. */
    246. public int XOR(int res, String key) {
    247. return res ^ key.hashCode();
    248. }
    249. /**
    250. * 使用Base64进行加密
    251. * @param res 密文
    252. * @return
    253. */
    254. public static String Base64Encode(String res) {
    255. return Base64.encode(res.getBytes());
    256. }
    257. /**
    258. * 使用Base64进行解密
    259. * @param res
    260. * @return
    261. */
    262. public static String Base64Decode(String res) {
    263. return new String(Base64.decode(res));
    264. }
    265. }