zoukankan      html  css  js  c++  java
  • Java中的各种加密算法

     

     JAVA中为我们提供了丰富的加密技术。能够主要的分为单向加密和非对称加密

     1.单向加密算法

     单向加密算法主要用来验证传输数据的过程中。是否被篡改过。

    • BASE64 严格地说,属于编码格式。而非加密算法

    • MD5(Message Digest algorithm 5,信息摘要算法)

    • SHA(Secure Hash Algorithm。安全散列算法)

    • HMAC(Hash Message Authentication Code,散列消息鉴别码

     2.对称和非对称加密算法
       对称和非对称加密算法主要採用公钥和私钥的形式。来对数据加密。
    • DES(Data Encryption Standard,数据加密算法)

    • PBE(Password-based encryption,基于password验证)

    • RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

    • DH(Diffie-Hellman算法。密钥一致协议)

    • DSA(Digital Signature Algorithm。数字签名)

    • ECC(Elliptic Curves Cryptography,椭圆曲线password编码学)


      很多其它理论的简单介绍。请自行查阅。以下提供代码,来看一下。

      基础加密
     
    package com.test;
    import java.security.MessageDigest;
    
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    /**  
     * @ClassName: coder   
     * @Description: 加密组件
     * @author: LUCKY  
     * @date:2016年1月4日 下午1:24:12     
     */ 
    public abstract class coder {
        public static final String KEY_SHA = "SHA";
        public static final String KEY_MD5 = "MD5";
     
        /**
         * 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);
     
        }
    }


    RSA安全编码组件
     
    package com.test;
    import java.security.Key;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.crypto.Cipher;
     
    
    /**  
     * @ClassName: RSACoder   
     * @Description: RSA安全编码组件
     * @author: LUCKY  
     * @date:2016年1月4日 下午1:25:34     
     */ 
    public abstract class RSACoder extends coder {
        public static final String KEY_ALGORITHM = "RSA";
        public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
     
        private static final String PUBLIC_KEY = "RSAPublicKey";
        private static final String PRIVATE_KEY = "RSAPrivateKey";
     
        /**
         * 用私钥对信息生成数字签名
         * 
         * @param data
         *            加密数据
         * @param privateKey
         *            私钥
         * 
         * @return
         * @throws Exception
         */
        public static String sign(byte[] data, String privateKey) throws Exception {
            // 解密由base64编码的私钥
            byte[] keyBytes = decryptBASE64(privateKey);
     
            // 构造PKCS8EncodedKeySpec对象
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
     
            // KEY_ALGORITHM 指定的加密算法
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     
            // 取私钥匙对象
            PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
     
            // 用私钥对信息生成数字签名
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initSign(priKey);
            signature.update(data);
     
            return encryptBASE64(signature.sign());
        }
     
        /**
         * 校验数字签名
         * 
         * @param data
         *            加密数据
         * @param publicKey
         *            公钥
         * @param sign
         *            数字签名
         * 
         * @return 校验成功返回true 失败返回false
         * @throws Exception
         * 
         */
        public static boolean verify(byte[] data, String publicKey, String sign)
                throws Exception {
     
            // 解密由base64编码的公钥
            byte[] keyBytes = decryptBASE64(publicKey);
     
            // 构造X509EncodedKeySpec对象
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
     
            // KEY_ALGORITHM 指定的加密算法
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     
            // 取公钥匙对象
            PublicKey pubKey = keyFactory.generatePublic(keySpec);
     
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initVerify(pubKey);
            signature.update(data);
     
            // 验证签名是否正常
            return signature.verify(decryptBASE64(sign));
        }
     
        /**
         * 解密<br>
         * 用私钥解密
         * 
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] decryptByPrivateKey(byte[] data, String key)
                throws Exception {
            // 对密钥解密
            byte[] keyBytes = decryptBASE64(key);
     
            // 取得私钥
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
     
            // 对数据解密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
     
            return cipher.doFinal(data);
        }
     
        /**
         * 解密<br>
         * 用私钥解密
         * 
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] decryptByPublicKey(byte[] data, String key)
                throws Exception {
            // 对密钥解密
            byte[] keyBytes = decryptBASE64(key);
     
            // 取得公钥
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key publicKey = keyFactory.generatePublic(x509KeySpec);
     
            // 对数据解密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
     
            return cipher.doFinal(data);
        }
     
        /**
         * 加密<br>
         * 用公钥加密
         * 
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] encryptByPublicKey(byte[] data, String key)
                throws Exception {
            // 对公钥解密
            byte[] keyBytes = decryptBASE64(key);
     
            // 取得公钥
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key publicKey = keyFactory.generatePublic(x509KeySpec);
     
            // 对数据加密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
     
            return cipher.doFinal(data);
        }
     
        /**
         * 加密<br>
         * 用私钥加密
         * 
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] encryptByPrivateKey(byte[] data, String key)
                throws Exception {
            // 对密钥解密
            byte[] keyBytes = decryptBASE64(key);
     
            // 取得私钥
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
     
            // 对数据加密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
     
            return cipher.doFinal(data);
        }
     
        /**
         * 取得私钥
         * 
         * @param keyMap
         * @return
         * @throws Exception
         */
        public static String getPrivateKey(Map<String, Object> keyMap)
                throws Exception {
            Key key = (Key) keyMap.get(PRIVATE_KEY);
     
            return encryptBASE64(key.getEncoded());
        }
     
        /**
         * 取得公钥
         * 
         * @param keyMap
         * @return
         * @throws Exception
         */
        public static String getPublicKey(Map<String, Object> keyMap)
                throws Exception {
            Key key = (Key) keyMap.get(PUBLIC_KEY);
     
            return encryptBASE64(key.getEncoded());
        }
     
        /**
         * 初始化密钥
         * 
         * @return
         * @throws Exception
         */
        public static Map<String, Object> initKey() throws Exception {
            KeyPairGenerator keyPairGen = KeyPairGenerator
                    .getInstance(KEY_ALGORITHM);
            keyPairGen.initialize(1024);
     
            KeyPair keyPair = keyPairGen.generateKeyPair();
     
            // 公钥
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
     
            // 私钥
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
     
            Map<String, Object> keyMap = new HashMap<String, Object>(2);
     
            keyMap.put(PUBLIC_KEY, publicKey);
            keyMap.put(PRIVATE_KEY, privateKey);
            return keyMap;
        }
    }

     很多其它请參考            各种加密算法
                                   聊一聊MD5加密

  • 相关阅读:
    1. Go的安装和第一行代码
    合工大OJ 1344
    __int64与long long、long的区别
    合工大OJ 1343
    如何快速查找下载java项目所需jar包
    油田勘测(深度优先算法,广度优先算法)
    图的创建(邻接矩阵)
    五大常用算法总结
    前序遍历,中序遍历,后序遍历(树的深度优先算法),层序遍历(树的广度优先算法)
    IE CSS Hack
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6957804.html
Copyright © 2011-2022 走看看