1. 程式人生 > >Java 實現對稱加密

Java 實現對稱加密

文章目錄

Java 實現對稱加密

對稱加密指加密和解密使用相同金鑰的加密演算法。

DES(Data Encryption Standard)資料加密標準

  • 應用
    DES

1 JDK 的 DES 實現

import org.apache.commons.codec.binary.Hex;

import javax.crypto.
Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.security.Key; import java.security.SecureRandom; public class SymmetricalEncryptionUtils { public static String jdkDES(String str) { try { // 生成 KEY
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); System.out.println(keyGenerator.getProvider()); keyGenerator.init(new SecureRandom()); Key secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); // KEY 轉換 DESKeySpec desKeySpec = new DESKeySpec(keyBytes); 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(str.getBytes()); // 解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); System.out.println("JDK DES Decrypt: " + new String(cipher.doFinal(result))); return Hex.encodeHexString(result); } catch (Exception e) { throw new RuntimeException(e); } } }

2 Bouncy Castle 的 DES 實現

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

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

public class SymmetricalEncryptionUtils {
    public static String bcDES(String str) {
        Security.addProvider(new BouncyCastleProvider());

        try {
            // 生成 KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES", "BC");
            System.out.println(keyGenerator.getProvider());
            keyGenerator.init(new SecureRandom());
            Key secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // KEY 轉換
            DESKeySpec desKeySpec = new DESKeySpec(keyBytes);
            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(str.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
            System.out.println("BC DES Decrypt: " + new String(cipher.doFinal(result)));

            return Hex.encodeHexString(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3DES(Triple DES)三重資料加密演算法

1 JDK 的 3DES 實現

import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import java.security.Key;
import java.security.SecureRandom;

public class SymmetricalEncryptionUtils {
    public static String jdk3DES(String str) {
        try {
            // 生成 KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
            System.out.println(keyGenerator.getProvider());
            keyGenerator.init(new SecureRandom());
            Key secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // KEY 轉換
            DESedeKeySpec desKeySpec = new DESedeKeySpec(keyBytes);
            SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
            Key convertSecretKey = factory.generateSecret(desKeySpec);

            // 加密
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
            byte[] result = cipher.doFinal(str.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
            System.out.println("JDK 3DES Decrypt: " + new String(cipher.doFinal(result)));

            return Hex.encodeHexString(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2 Bouncy Castle 的 3DES 實現

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;

public class SymmetricalEncryptionUtils {
    public static String bc3DES(String str) {
        Security.addProvider(new BouncyCastleProvider());
        try {
            // 生成 KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede", "BC");
            System.out.println(keyGenerator.getProvider());
            keyGenerator.init(new SecureRandom());
            Key secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // KEY 轉換
            DESedeKeySpec desKeySpec = new DESedeKeySpec(keyBytes);
            SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
            Key convertSecretKey = factory.generateSecret(desKeySpec);

            // 加密
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
            byte[] result = cipher.doFinal(str.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
            System.out.println("BC 3DES Decrypt: " + new String(cipher.doFinal(result)));

            return Hex.encodeHexString(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

AES(Advanced Encryption Standard)高階加密標準

AES 是對稱金鑰加密中最流行的演算法之一。

1 JDK 的 AES 實現

import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.SecureRandom;

public class SymmetricalEncryptionUtils {
    public static String jdkAES(String str) {
        try {
            // 生成 KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            System.out.println(keyGenerator.getProvider());
            keyGenerator.init(new SecureRandom());
            Key secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // KEY 轉換
            Key convertSecretKey = new SecretKeySpec(keyBytes, "AES");

            // 加密
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
            byte[] result = cipher.doFinal(str.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
            System.out.println("JDK AES Decrypt: " + new String(cipher.doFinal(result)));

            return Hex.encodeHexString(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2 Bouncy Castle 的 AES 實現

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;

public class SymmetricalEncryptionUtils {
    public static String bcAES(String str) {
        Security.addProvider(new BouncyCastleProvider());
        try {
            // 生成 KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES", "BC");
            System.out.println(keyGenerator.getProvider());
            keyGenerator.init(new SecureRandom());
            Key secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // KEY 轉換
            Key convertSecretKey = new SecretKeySpec(keyBytes, "AES");

            // 加密
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
            byte[] result = cipher.doFinal(str.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
            System.out.println("BC AES Decrypt: " + new String(cipher.doFinal(result)));

            return Hex.encodeHexString(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

PBE(Password Based Encryption)基於口令加密

PBE 演算法結合了訊息摘要演算法和對稱加密演算法的優點。

  • 應用
    PBE

1 JDK 的 PBE 實現

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

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.security.Key;
import java.security.SecureRandom;

public class SymmetricalEncryptionUtils {
    public static String jdkPBE(String str) {
        // 初始化鹽
        SecureRandom random = new SecureRandom();
        byte[] salt = random.generateSeed(8);

        // 口令與金鑰
        String password = "test";
        PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
        try {
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            System.out.println(factory.getProvider());
            Key key = factory.generateSecret(pbeKeySpec);

            // 加密
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
            byte[] result = cipher.doFinal(str.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
            System.out.println("JDK PBE Decrypt: " + new String(cipher.doFinal(result)));

            return Base64.encodeBase64String(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2 Bouncy Castle 的 PBE 實現

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;

public class SymmetricalEncryptionUtils {
    public static String bcPBE(String str) {
        // 初始化鹽
        SecureRandom random = 
            
           

相關推薦

Java 實現對稱加密

文章目錄 Java 實現對稱加密 DES(Data Encryption Standard)資料加密標準 1 JDK 的 DES 實現 2 Bouncy Castle 的 DES 實現 3DES(Tri

java實現對稱加密AES和DES的加密、解密

        目前主流的加密方式有:1、對稱加密:AES、DES      2、非對稱加密:RSA、DSA。         本文主要講解java實現呼叫AES/DES加密演算法包,呼叫過程最精要的就是下面兩句話: Cipher cipher = Cipher.getIn

JAVA實現RSA加密,非對稱加密演算法

RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair;

Java實現AES加密(轉)

密鑰 工具 mex 嚴格 keys 生產 ner for 創建 一)什麽是AES? 高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),是一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。 那麽為什麽

JAVA實現DES加密實現詳解

ava util des算法 直接 print uri ret secure 過程 package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import j

java實現md5加密

comm 代碼 inf 應用領域 ast center href 攻擊 字符串

java對稱加密RSA

init nco security stat deb 編碼 IT hal mex package com.aarony.test; import java.io.IOException; import java.security.KeyFactory; imp

**Java實現Base64加密**

package com.beiruan.test; import org.apache.commons.codec.binary.Base64; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public clas

Linux初級:gpg實現對稱加密和公鑰加密

gpg實現對稱加密 1、對檔案加密(對dushan這個檔案加密)gpg -c dushan 2、對檔案進行解密,(對生成的dushan.gpg並輸出到檔案file.txt中,注意-o選線必須在前-d在選項在後) gpg -o file.txt -d dushan.gpg gpg實

條理清晰的入門:使用Java實現RSA加密解密

條理清晰的入門:使用Java實現RSA加密解密 什麼是RSA 使用Java 需要匯入的標頭檔案 生成公鑰、私鑰 進行加密解密 金鑰的儲存 密文的儲存、讀取 什麼是RSA 翻一下以前的密碼

java實現簡易加密和解密

實現原理:               通過位運算的異或運算子“^”把字串與一個指定的值進行異或運算,從而改變字串中的每個字元的值,這樣就可以得到一個加密後的字串。傳送後再將加密後的字串通過源程式實現解

資料加解密基礎知識介紹,及Java實現Base64加密

加密流程涉及的一些關鍵詞: 明文:準備加密的資訊 加密:把明文處理為密文的過程 加密演算法:具體實現明文轉為密文的演算法 加密金鑰:通過加密演算法進行加密操作需要的金鑰 密文:被加密的明文 解密:將密文轉為明文的過程 解密演算法:具體實現密文轉為明文的演算法 解

Java對稱加密演算法RSA

流程分析:  甲方構建金鑰對兒,將公鑰公佈給乙方,將私鑰保留。 甲方使用私鑰加密資料,然後用私鑰對加密後的資料簽名,傳送給乙方簽名以及加密後的資料;乙方使用公鑰、簽名來驗證待解密資料是否有效,如果有效使用公鑰對資料解密。 乙方使用公鑰加密資料,向甲方傳送經過加密後的資料

java對稱加密演算法 AES -----加密和解密

背景 隨著對稱密碼的發展,DES資料加密標準演算法由於金鑰長度較小(56位),已經不適應當今分散式開放網路對資料加密安全性的要求,因此1997年NIST公開徵集新的資料加密標準,即AES[1]。經過三輪的篩選,比利時Joan Daeman和Vincent Rijmen提

JAVA實現RSA加密解密

RSA 工具類。提供加密,解密,生成金鑰對等方法。  RSA加密原理概述   : RSA的安全性依賴於大數的分解,公鑰和私鑰都是兩個大素數(大於100的十進位制位)的函式。 據猜測,從一個金鑰和密文推斷出明文的難度等同於分解兩個大素數的積    金鑰的產生:     1.選

Java實現MD5加密與解密

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class TestMD5 {public static void Md5(String plainText){try { Me

Java實現Base64加密和解密

Base64是一種編碼格式,而不是演算法。 首先引入Base64類庫的maven依賴 <dependency> <groupId>com.xiaoleilu</groupId> <

JAVA 實現AES加密的兩種方法

寫在前面的話:    1.建議加密後將密文轉為16進位制的字串(便於觀看)。    2.以下的兩種加密的方法金鑰不限定長度。[java] view plain copy print?/**  *AES加密解密工具類  *@author M-Y  */  public clas

java 實現各種加密(MD5 ,SHA-1,SHA-256)

常用加密演算法通用方法: package BinTest.bin; import java.security.MessageDigest; import java.security.NoSuchAl

Java實現DES加密解密演算法

import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFact