zoukankan      html  css  js  c++  java
  • BASE64,MD5,SHA,HMAC加密與解密算法(java)

      1 package com.ice.webos.util.security;
    2
    3 import java.io.UnsupportedEncodingException;
    4 import java.math.BigInteger;
    5 import java.security.Key;
    6 import java.security.MessageDigest;
    7 import java.security.SecureRandom;
    8
    9 import javax.crypto.Cipher;
    10 import javax.crypto.KeyGenerator;
    11 import javax.crypto.Mac;
    12 import javax.crypto.SecretKey;
    13 import javax.crypto.SecretKeyFactory;
    14 import javax.crypto.spec.DESKeySpec;
    15 import javax.crypto.spec.SecretKeySpec;
    16
    17 import sun.misc.BASE64Decoder;
    18 import sun.misc.BASE64Encoder;
    19
    20 /**
    21 * <ul>
    22 * <li>BASE64的加密解密是双向的,可以求反解。</li>
    23 * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。</li>
    24 * <li>HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。</li>
    25 * <li>DES DES-Data Encryption Standard,即数据加密算法。
    26 * DES算法的入口参数有三个:Key、Data、Mode。
    27 * <ul>
    28 * <li>Key:8个字节共64位,是DES算法的工作密钥;</li>
    29 * <li>Data:8个字节64位,是要被加密或被解密的数据;</li>
    30 * <li>Mode:DES的工作方式,有两种:加密或解密。</li>
    31 * </ul>
    32 * </li>
    33 * <ul>
    34 *
    35 * @author Ice_Liu
    36 *
    37 */
    38 public class CryptUtil {
    39 private static final String KEY_MD5 = "MD5";
    40 private static final String KEY_SHA = "SHA";
    41 /**
    42 * MAC算法可选以下多种算法
    43 *
    44 * <pre>
    45 *
    46 * HmacMD5
    47 * HmacSHA1
    48 * HmacSHA256
    49 * HmacSHA384
    50 * HmacSHA512
    51 * </pre>
    52 */
    53 public static final String KEY_MAC = "HmacMD5";
    54
    55 /**
    56 * BASE64解密
    57 *
    58 * @param key
    59 * @return
    60 * @throws Exception
    61 */
    62 public static byte[] decryptBASE64(String key) throws Exception {
    63 return (new BASE64Decoder()).decodeBuffer(key);
    64 }
    65
    66 /**
    67 * BASE64 加密
    68 *
    69 * @param key
    70 * @return
    71 * @throws Exception
    72 */
    73 public static String encryptBASE64(byte[] key) throws Exception {
    74 return (new BASE64Encoder()).encodeBuffer(key);
    75 }
    76
    77 /**
    78 * MD5加密
    79 *
    80 * @param data
    81 * @return
    82 * @throws Exception
    83 */
    84 public static byte[] encryptMD5(byte[] data) throws Exception {
    85
    86 MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
    87 md5.update(data);
    88
    89 return md5.digest();
    90
    91 }
    92
    93 /**
    94 * SHA加密
    95 *
    96 * @param data
    97 * @return
    98 * @throws Exception
    99 */
    100 public static byte[] encryptSHA(byte[] data) throws Exception {
    101
    102 MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
    103 sha.update(data);
    104
    105 return sha.digest();
    106
    107 }
    108
    109 /**
    110 * 初始化HMAC密钥
    111 *
    112 * @return
    113 * @throws Exception
    114 */
    115 public static String initMacKey() throws Exception {
    116 KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
    117 SecretKey secretKey = keyGenerator.generateKey();
    118 return encryptBASE64(secretKey.getEncoded());
    119 }
    120
    121 /**
    122 * HMAC 加密
    123 *
    124 * @param data
    125 * @param key
    126 * @return
    127 * @throws Exception
    128 */
    129 public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
    130 SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
    131 Mac mac = Mac.getInstance(secretKey.getAlgorithm());
    132 mac.init(secretKey);
    133 return mac.doFinal(data);
    134 }
    135
    136 /**
    137 * DES 算法 <br>
    138 * 可替换为以下任意一种算法,同时key值的size相应改变。
    139 *
    140 * <pre>
    141 * DES key size must be equal to 56
    142 * DESede(TripleDES) key size must be equal to 112 or 168
    143 * AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
    144 * Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
    145 * RC2 key size must be between 40 and 1024 bits
    146 * RC4(ARCFOUR) key size must be between 40 and 1024 bits
    147 * </pre>
    148 */
    149 public static final String ALGORITHM = "DES";
    150
    151 /**
    152 * DES 算法转换密钥<br>
    153 *
    154 * @param key
    155 * @return
    156 * @throws Exception
    157 */
    158 private static Key toKey(byte[] key) throws Exception {
    159 SecretKey secretKey = null;
    160 if (ALGORITHM.equals("DES") || ALGORITHM.equals("DESede")) {
    161 DESKeySpec dks = new DESKeySpec(key);
    162 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
    163 secretKey = keyFactory.generateSecret(dks);
    164 } else {
    165 // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
    166 secretKey = new SecretKeySpec(key, ALGORITHM);
    167 }
    168 return secretKey;
    169 }
    170
    171 /**
    172 * DES 算法解密
    173 *
    174 * @param data
    175 * @param key
    176 * @return
    177 * @throws Exception
    178 */
    179 public static byte[] decrypt(byte[] data, String key) throws Exception {
    180 Key k = toKey(decryptBASE64(key));
    181 Cipher cipher = Cipher.getInstance(ALGORITHM);
    182 cipher.init(Cipher.DECRYPT_MODE, k);
    183 return cipher.doFinal(data);
    184 }
    185
    186 /**
    187 * DES 算法加密
    188 *
    189 * @param data
    190 * @param key
    191 * @return
    192 * @throws Exception
    193 */
    194 public static byte[] encrypt(byte[] data, String key) throws Exception {
    195 Key k = toKey(decryptBASE64(key));
    196 Cipher cipher = Cipher.getInstance(ALGORITHM);
    197 cipher.init(Cipher.ENCRYPT_MODE, k);
    198 return cipher.doFinal(data);
    199 }
    200
    201 /**
    202 * DES 算法生成密钥
    203 *
    204 * @return
    205 * @throws Exception
    206 */
    207 public static String initKey() throws Exception {
    208 return initKey(null);
    209 }
    210
    211 /**
    212 * DES 算法生成密钥
    213 *
    214 * @param seed
    215 * @return
    216 * @throws Exception
    217 */
    218 public static String initKey(String seed) throws Exception {
    219 SecureRandom secureRandom = null;
    220 if (seed != null) {
    221 secureRandom = new SecureRandom(decryptBASE64(seed));
    222 } else {
    223 secureRandom = new SecureRandom();
    224 }
    225 KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
    226 kg.init(secureRandom);
    227 SecretKey secretKey = kg.generateKey();
    228 return encryptBASE64(secretKey.getEncoded());
    229 }
    230
    231 public static void main(String[] args) {
    232 try {
    233 String s = "阿伯才的覆盖";
    234 String b = CryptUtil.encryptBASE64(s.getBytes("UTF-8"));
    235 System.out.println("BASE64加密后:" + b);
    236 byte[] c = CryptUtil.decryptBASE64(b);
    237 System.out.println("BASE64解密后:" + new String(c, "UTF-8"));
    238
    239 c = encryptMD5(s.getBytes());
    240 System.out.println("MD5 加密后:" + new BigInteger(c).toString(16));
    241
    242 c = encryptSHA(s.getBytes());
    243 System.out.println("SHA 加密后:" + new BigInteger(c).toString(16));
    244
    245 String key = initMacKey();
    246 System.out.println("HMAC密匙:" + key);
    247 c = encryptHMAC(s.getBytes(), key);
    248 System.out.println("HMAC 加密后:" + new BigInteger(c).toString(16));
    249
    250 key = initKey();
    251 System.out.println(ALGORITHM + "密钥:\t" + key);
    252 c = encrypt(s.getBytes("UTF-8"), key);
    253 System.out.println(ALGORITHM + " 加密后:" + new BigInteger(c).toString(16));
    254 c = decrypt(c, key);
    255 System.out.println(ALGORITHM + " 解密后:" + new String(c, "UTF-8"));
    256 } catch (UnsupportedEncodingException e) {
    257 // TODO Auto-generated catch block
    258 e.printStackTrace();
    259 } catch (Exception e) {
    260 // TODO Auto-generated catch block
    261 e.printStackTrace();
    262 }
    263 }
    264 }
  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/liubin0509/p/2331066.html
Copyright © 2011-2022 走看看