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

    package com.ice.webos.util.security;
    
    import java.io.UnsupportedEncodingException;
    import java.math.BigInteger;
    import java.security.Key;
    import java.security.MessageDigest;
    import java.security.SecureRandom;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.SecretKeySpec;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    /**
    * <ul>
    * <li>BASE64的加密解密是双向的,可以求反解。</li>
    * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。</li>
    * <li>HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。</li>
    * <li>DES DES-Data Encryption Standard,即数据加密算法。
    * DES算法的入口参数有三个:Key、Data、Mode。
    * <ul>
    * <li>Key:8个字节共64位,是DES算法的工作密钥;</li>
    * <li>Data:8个字节64位,是要被加密或被解密的数据;</li>
    * <li>Mode:DES的工作方式,有两种:加密或解密。</li>
    * </ul>
    * </li>
    * <ul>
    * 
    * @author Ice_Liu
    * 
    */
    public class CryptUtil {
    private static final String KEY_MD5 = "MD5";
    private static final String KEY_SHA = "SHA";
    /**
    * MAC算法可选以下多种算法
    * 
    * <pre>
    * 
    * HmacMD5 
    * HmacSHA1 
    * HmacSHA256 
    * HmacSHA384 
    * HmacSHA512 
    * </pre>
    */
    public static final String KEY_MAC = "HmacMD5";
    
    /**
    * BASE64解密
    * 
    * @param key
    * @return
    * @throws Exception
    */
    public static byte[] decryptBASE64(String key) throws Exception {
    return (new BASE64Decoder()).decodeBuffer(key);
    }
    
    /**
    * BASE64 加密
    * 
    * @param key
    * @return
    * @throws Exception
    */
    public static String encryptBASE64(byte[] key) throws Exception {
    return (new BASE64Encoder()).encodeBuffer(key);
    }
    
    /**
    * MD5加密
    * 
    * @param data
    * @return
    * @throws Exception
    */
    public static byte[] encryptMD5(byte[] data) throws Exception {
    
    MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
    md5.update(data);
    
    return md5.digest();
    
    }
    
    /**
    * SHA加密
    * 
    * @param data
    * @return
    * @throws Exception
    */
    public static byte[] encryptSHA(byte[] data) throws Exception {
    
    MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
    sha.update(data);
    
    return sha.digest();
    
    }
    
    /**
    * 初始化HMAC密钥
    * 
    * @return
    * @throws Exception
    */
    public static String initMacKey() throws Exception {
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
    SecretKey secretKey = keyGenerator.generateKey();
    return encryptBASE64(secretKey.getEncoded());
    }
    
    /**
    * HMAC 加密
    * 
    * @param data
    * @param key
    * @return
    * @throws Exception
    */
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
    SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
    Mac mac = Mac.getInstance(secretKey.getAlgorithm());
    mac.init(secretKey);
    return mac.doFinal(data);
    }
    
    /**
    * DES 算法 <br>
    * 可替换为以下任意一种算法,同时key值的size相应改变。
    * 
    * <pre>
    * DES key size must be equal to 56 
    * DESede(TripleDES) key size must be equal to 112 or 168 
    * AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available 
    * Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive) 
    * RC2 key size must be between 40 and 1024 bits 
    * RC4(ARCFOUR) key size must be between 40 and 1024 bits 
    * </pre>
    */
    public static final String ALGORITHM = "DES";
    
    /**
    * DES 算法转换密钥<br>
    * 
    * @param key
    * @return
    * @throws Exception
    */
    private static Key toKey(byte[] key) throws Exception {
    SecretKey secretKey = null;
    if (ALGORITHM.equals("DES") || ALGORITHM.equals("DESede")) {
    DESKeySpec dks = new DESKeySpec(key);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
    secretKey = keyFactory.generateSecret(dks);
    } else {
    // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
    secretKey = new SecretKeySpec(key, ALGORITHM);
    }
    return secretKey;
    }
    
    /**
    * DES 算法解密
    * 
    * @param data
    * @param key
    * @return
    * @throws Exception
    */
    public static byte[] decrypt(byte[] data, String key) throws Exception {
    Key k = toKey(decryptBASE64(key));
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, k);
    return cipher.doFinal(data);
    }
    
    /**
    * DES 算法加密
    * 
    * @param data
    * @param key
    * @return
    * @throws Exception
    */
    public static byte[] encrypt(byte[] data, String key) throws Exception {
    Key k = toKey(decryptBASE64(key));
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, k);
    return cipher.doFinal(data);
    }
    
    /**
    * DES 算法生成密钥
    * 
    * @return
    * @throws Exception
    */
    public static String initKey() throws Exception {
    return initKey(null);
    }
    
    /**
    * DES 算法生成密钥
    * 
    * @param seed
    * @return
    * @throws Exception
    */
    public static String initKey(String seed) throws Exception {
    SecureRandom secureRandom = null;
    if (seed != null) {
    secureRandom = new SecureRandom(decryptBASE64(seed));
    } else {
    secureRandom = new SecureRandom();
    }
    KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
    kg.init(secureRandom);
    SecretKey secretKey = kg.generateKey();
    return encryptBASE64(secretKey.getEncoded());
    }
    
    public static void main(String[] args) {
    try {
    String s = "阿伯才的覆盖";
    String b = CryptUtil.encryptBASE64(s.getBytes("UTF-8"));
    System.out.println("BASE64加密后:" + b);
    byte[] c = CryptUtil.decryptBASE64(b);
    System.out.println("BASE64解密后:" + new String(c, "UTF-8"));
    
    c = encryptMD5(s.getBytes());
    System.out.println("MD5 加密后:" + new BigInteger(c).toString(16));
    
    c = encryptSHA(s.getBytes());
    System.out.println("SHA 加密后:" + new BigInteger(c).toString(16));
    
    String key = initMacKey();
    System.out.println("HMAC密匙:" + key);
    c = encryptHMAC(s.getBytes(), key);
    System.out.println("HMAC 加密后:" + new BigInteger(c).toString(16));
    
    key = initKey();
    System.out.println(ALGORITHM + "密钥:	" + key);
    c = encrypt(s.getBytes("UTF-8"), key);
    System.out.println(ALGORITHM + " 加密后:" + new BigInteger(c).toString(16));
    c = decrypt(c, key);
    System.out.println(ALGORITHM + " 解密后:" + new String(c, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    
    
    转发 http://www.cnblogs.com/liubin0509/archive/2012/01/29/2331066.html
  • 相关阅读:
    Flip Game(枚举)Poj
    Ubuntu下启动Eclipse报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must
    [cocos2dx笔记012]一定简易的UI配置类
    [MSSQL]採用pivot函数实现动态行转列
    (八十八)VFL语言初步
    Leetcode 218 The Skyline Problem
    mac 下作流程图工具omnigraffle
    JSP生成word文件
    状态压缩dp poj 3254 hdu5045
    hdu 1215 七夕节
  • 原文地址:https://www.cnblogs.com/myjoan/p/4111038.html
Copyright © 2011-2022 走看看