日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、概述

實際工作中遇到的加密解密算法和算法之間的區別以及如何選擇,包括:BASE64、DES、3DES、AES、RSA、MD5、SHA。

區別與選擇:

1. 加密算法可逆,用來保證數據安全,散列算法不可逆,用來驗證身份。
2. 對稱加密算法,速度快,適合給大量數據加密,交互雙方使用同一個密鑰,存在被抓包破解的風險。
3. 非對稱加密算法使用公鑰加密,私鑰解密,私鑰簽名,公鑰驗簽,安全性較高,但速度較慢。非對稱加密使用兩個密鑰,服務端和客戶端密匙不一樣,私鑰放在服務端,安全性高。4、在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。

 

二、編碼加解密

1、Base64:

說明:嚴格意義來說Base64并不是一種加密/解密算法,而是一種編碼的方式。Base64不生成密鑰,通過Base64編碼后的密文就可以直接“翻譯”為明文。在網絡上傳輸數據時,往往要經過多個路由設備,由于不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利于傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低,Base64轉換后的字符串理論上將要比原來的長1/3。

例子:

package com.yx.encryption;

import JAVA.util.Base64;

/**
 * Base64使用例子
 * 加密和解密
 *
 * @author yx
 */
public class Base64Demo {
    public static void main(String[] args) {
        // 加密文字
        String data = "EasyJava";

        // 加密
        byte[] encode = Base64.getEncoder().encode(data.getBytes());
        String enCodeResult = new String(encode);
        System.out.println("加密結果:" + enCodeResult);

        // 解密
        byte[] decode = Base64.getDecoder().decode(enCodeResult);
        String decodeResult = new String(decode);
        System.out.println("解密結果:" + decodeResult);
    }
}


執行結果:

加密結果:RWFzeUphdmE=
解密結果:EasyJava

 

三、對稱加解密

1、DES:

說明:DES是一種基于56位密鑰的對稱算法,1976年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),隨后在國際上廣泛流傳開來。現在DES已經不是一種安全的加密算法,已被公開破解,現在DES已經被高級加密標準(AES)所代替。新項目不建議選擇DES,這種加密方式只存在歷史項目中。

例子:

package com.yx.encryption;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;

/**
 * DES使用例子
 * 加密和解密
 *
 * @author yx
 */
public class DESDemo {
    /**
     * 密鑰
     */
    private static String SECRET_KEY = "12345678";

    private static final char[] HEXES = {
            '0', '1', '2', '3',
            '4', '5', '6', '7',
            '8', '9', 'a', 'b',
            'c', 'd', 'e', 'f'
    };

    /**
     * byte數組 轉換成 16進制小寫字符串
     */
    public static String bytes2Hex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        StringBuilder hex = new StringBuilder();
        for (byte b : bytes) {
            hex.Append(HEXES[(b >> 4) & 0x0F]);
            hex.append(HEXES[b & 0x0F]);
        }
        return hex.toString();
    }

    public static void main(String[] args) throws Exception {
        // 加密字符串
        String src = "EasyJava";
        //KEY轉換
        DESKeySpec desKeySpec = new DESKeySpec(SECRET_KEY.getBytes("utf-8"));
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
        Key convertSecretKey = factory.generateSecret(desKeySpec);
        //加密
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
        byte[] result = cipher.doFinal(src.getBytes());
        System.out.println("加密結果: " + bytes2Hex(result));
        //解密
        cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
        result = cipher.doFinal(result);
        System.out.println("解密結果: " + new String(result));
    }
}

執行結果:

加密結果: dcf185f57bb08208feb959b7d4642fcb
解密結果: EasyJava

2、3DES

說明:相當于是對每個數據塊應用三次DES加密算法。由于計算機運算能力的增強,原版DES密碼的密鑰長度變得容易被暴力破解,3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新密碼算法。

例子:

package com.yx.encryption;

import org.Apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;

/**
 * DES3使用例子
 * 加密和解密
 *
 * @author yx
 */
public class DES3Demo {
    /**
     * 密鑰(24位)
     */
    private static String SECRET_KEY = "123456781234567812345678";

    private static final String KEY_ALGORITHM = "DESede";
    private static final String CIPHER_ALGORITHM = "DESede/CBC/PKCS5Padding";

    /**
     * 3DES 加密
     *
     * @param key  密鑰(24位)
     * @param iv   偏移量
     * @param data 需要加密的字符串
     * @return 返回加密的字符串
     */
    public static String encrypt(String key, String iv, String data) {
        try {
            DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
            Key desKey = keyFactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.ENCRYPT_MODE, desKey, ips);
            byte[] bOut = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Base64.encodeBase64String(bOut);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("3DES 解密錯誤");
            throw new RuntimeException("3DES 解密錯誤");
        }
    }

    /**
     * 3DES 解密
     *
     * @param key  密鑰(24位)
     * @param iv   偏移量
     * @param data 需要解密的密文
     * @return 返回加密的字符串
     */
    public static String decrypt(String key, String iv, String data) {
        try {
            DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
            Key desKey = keyFactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.DECRYPT_MODE, desKey, ips);
            byte[] bOut = cipher.doFinal(Base64.decodeBase64(data.getBytes(StandardCharsets.UTF_8)));
            return new String(bOut, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("3DES 解密錯誤");
            throw new RuntimeException("3DES 解密錯誤");
        }
    }

    public static void main(String[] args) {
        String data = "EasyJava";

        String des3EncodeCBC = encrypt(SECRET_KEY, "53152654", data);
        System.out.println("加密結果:" + des3EncodeCBC);

        String des3DecodeCBC = decrypt(SECRET_KEY, "53152654", des3EncodeCBC);
        System.out.println("解密結果:" + des3DecodeCBC);
    }

}

執行結果:

加密結果:5GBjg/fcZ45YrGKm8nxHvQ==
解密結果:EasyJava

3、AES

說明:是目前對稱加密算法中最流行的算法之一,是DES的替代者,未被破解,性能更優。

例子:

package com.yx.encryption;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Base64;

/**
 * AES使用例子
 * 加密和解密
 *
 * @author yx
 */
public class AESDemo {
    /**
     * 密鑰(24)
     */
    private static String SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxxx";

    public static void main(String[] args) throws Exception {
        // 加密字符串
        String src = "EasyJava";
        // Key轉換
        Key key = new SecretKeySpec(SECRET_KEY.getBytes("utf-8"), "AES");

        // 加密
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptBytes = cipher.doFinal(src.getBytes("utf-8"));
        System.out.println("加密結果:" + Base64.getEncoder().encodeToString(encryptBytes));

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodeBytes = cipher.doFinal(encryptBytes);
        System.out.println("解密結果:" + new String(decodeBytes));
    }
}

執行結果:

加密結果:ESuCYW2piOpf4Expba6IuA==
解密結果:EasyJava

 

四、非對稱加解密

1、RSA

說明:廣泛接受且實現,多用于數據加密和數字簽名領域,支持公鑰加密私鑰解密,私鑰加密公鑰解密方式。

例子:

package com.yx.encryption;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

/**
 * RSA使用例子
 * 私鑰加密,公鑰解密
 * 公鑰加密,私鑰解密
 *
 * @author yx
 */
public class RSADemo {

    private static void encode1(String src, RSAPublicKey rsaPublicKey, RSAPrivateKey rsaPrivateKey) throws Exception {
        // 加密
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] encodeResult = cipher.doFinal(src.getBytes("utf-8"));
        System.out.println("【私鑰加密、公鑰解密】加密結果:" + Base64.getEncoder().encodeToString(encodeResult));

        // 解密
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
        keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] decodeResult = cipher.doFinal(encodeResult);
        System.out.println("【私鑰加密、公鑰解密】解密結果:" + new String(decodeResult, "utf-8"));
    }

    private static void encode2(String src, RSAPublicKey rsaPublicKey, RSAPrivateKey rsaPrivateKey) throws Exception {
        // 加密
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encodeResult = cipher.doFinal(src.getBytes("utf-8"));
        System.out.println("【公鑰加密、私鑰解密】加密結果:" + Base64.getEncoder().encodeToString(encodeResult));

        // 解密
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
        keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decodeResult = cipher.doFinal(encodeResult);
        System.out.println("【公鑰加密、私鑰解密】解密結果:" + new String(decodeResult, "utf-8"));
    }

    public static void main(String[] args) throws Exception {
        // 加密字符串
        String src = "EasyJava";

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(512);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        // 公鑰 & 私鑰
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
        System.out.println("公鑰:" + Base64.getEncoder().encodeToString(rsaPublicKey.getEncoded()));
        System.out.println("私鑰:" + Base64.getEncoder().encodeToString(rsaPrivateKey.getEncoded()));

        // 【私鑰加密、公鑰解密】
        encode1(src, rsaPublicKey, rsaPrivateKey);

        // 【公鑰加密、私鑰解密】
        encode2(src, rsaPublicKey, rsaPrivateKey);
    }
}

執行結果:

公鑰:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ68MgEMZD7X+5e9kYwLZfcXeCzlXlB3me/v214mON3ONbDjX++a3b7EqW+rVf49H9AmiY5bWuj335X/18/qyV8CAwEAAQ==
私鑰:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAnrwyAQxkPtf7l72RjAtl9xd4LOVeUHeZ7+/bXiY43c41sONf75rdvsSpb6tV/j0f0CaJjlta6Pfflf/Xz+rJXwIDAQABAkAnJACwgX22gUtofzYEcksSQpc/es9myBcNMvfEn2gmSO8wYDxTnyctYGC0slOjFXDSuTp5WoK/bRcAOWnDI/UBAiEA0uQJeMGpl5c8Qmbxs5NWJvXOntJE/S/Ka/1UgX/MJXUCIQDAsDf9rUDxzjF+hqY9Mv79STO3PYd5MZN/C3uHCGzVAwIgDf6d9kp7s5iQoiNstKr5U5qKPJXdiCOsvh/QhMtzQ6UCIFkiKwRh3KT+aM7KoqO0r1ejQRUGlWBumngua5nvP8jZAiBcdQ1czDuqBPQrua0DylFeP/3way2pKrQFg4xmNcM8Uw==
【私鑰加密、公鑰解密】加密結果:KjQIb91tWcau+FAwPF6AX6jw3QzYhXyaQQPG6roNWZ5wT1nMhanX2G1O2ZNPqVS2s3Ar4Cl1ROKYF6JmlEeYBw==
【私鑰加密、公鑰解密】解密結果:EasyJava
【公鑰加密、私鑰解密】加密結果:gw3PUe2zrCsZ+SyIgGBPX2ZnzQVnTZal7pvP4TZRGUzQho2IK91YjdbV8ec9Tp9HUHKVHMf96aNu2tRc7ZDMBg==
【公鑰加密、私鑰解密】解密結果:EasyJava

2、MD5

說明:嚴格意義上不屬于加密算法,屬于信息摘要算法。

例子:

package com.yx.encryption;

import java.security.MessageDigest;

/**
 * MD5使用例子
 * 生成消息摘要
 *
 * @author yx
 */
public class MD5Demo {

    private static final char[] HEXES = {
            '0', '1', '2', '3',
            '4', '5', '6', '7',
            '8', '9', 'a', 'b',
            'c', 'd', 'e', 'f'
    };

    /**
     * byte數組 轉換成 16進制小寫字符串
     */
    public static String bytes2Hex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        StringBuilder hex = new StringBuilder();
        for (byte b : bytes) {
            hex.append(HEXES[(b >> 4) & 0x0F]);
            hex.append(HEXES[b & 0x0F]);
        }
        return hex.toString();
    }

    public static void main(String[] args) throws Exception {
        // 加密字符
        String src = "EasyJava";

        // 獲取摘要
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        byte[] md5Result = messageDigest.digest(src.getBytes("utf-8"));
        System.out.println("摘要信息:" + bytes2Hex(md5Result));
    }
}

執行結果:

摘要信息:0d50d2ea5aece0b7bc10643a3f72159c

3、SHA

說明:SHA家族的五個算法,分別是SHA-1、SHA-224、SHA-256、SHA-384,和 SHA-512,后四者有時并稱為SHA-2。SHA-1在許多安全協定中廣為使用。 MD5與SHA1都是Hash算法,MD5輸出是128位的(轉換為16進制則為32個字符),SHA1輸出是160位的(轉換為16進制則為40個字符),MD5比SHA1快,SHA1比MD5強度高。

例子:

package com.yx.encryption;

import java.security.MessageDigest;

/**
 * SHA使用例子
 * 生成消息摘要
 *
 * @author yx
 */
public class SHADemo {

    private static final char[] HEXES = {
            '0', '1', '2', '3',
            '4', '5', '6', '7',
            '8', '9', 'a', 'b',
            'c', 'd', 'e', 'f'
    };

    /**
     * byte數組 轉換成 16進制小寫字符串
     */
    public static String bytes2Hex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        StringBuilder hex = new StringBuilder();
        for (byte b : bytes) {
            hex.append(HEXES[(b >> 4) & 0x0F]);
            hex.append(HEXES[b & 0x0F]);
        }
        return hex.toString();
    }

    public static void main(String[] args) throws Exception {
        // 加密字符
        String src = "EasyJava";

        // 獲取摘要
        MessageDigest messageDigest = MessageDigest.getInstance("SHA");
        messageDigest.update(src.getBytes("utf-8"));
        byte[] md5Result = messageDigest.digest();
        System.out.println("摘要信息:" + bytes2Hex(md5Result));
    }
}

執行結果:

摘要信息:a59bcc9c6c15610a8fc0dc75a1551903f5583a90

分享到:
標簽:算法
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定