1. 程式人生 > >DES、3DES、AES、PBE對稱加密演算法實現及應用

DES、3DES、AES、PBE對稱加密演算法實現及應用

1.對稱加密演算法概述

對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。

在對稱加密演算法中,使用的金鑰只有一個,發收信雙方都使用這個金鑰對資料進行加密和解密,這就要求解密方事先必須知道加密金鑰。

對稱加密演算法的特點是演算法公開、計算量小、加密速度快、加密效率高。

不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證。

在計算機系統中廣泛使用的對稱加密演算法有DES和IDEA等。因為DES近年來屢屢被破解,所以,美國國家標準局倡導的AES即將作為新標準取代DES。

2.對稱加密演算法-DES

DES演算法為密碼體制中的對稱密碼體制,又被稱為美國資料加密標準,是1972年美國IBM公司研製的對稱密碼體制加密演算法。

明文按64位進行分組,金鑰長64位,金鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位, 使得每個金鑰都有奇數個1)分組後的明文組和56位的金鑰按位替代或交換的方法形成密文組的加密方法。

金鑰長度 預設 工作模式 填充方式 實現方
56 56 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8到128、OFB、OFB8到128 NoPadding、PKCS5Padding、ISO10126Padding JDK
64 56 同上 PKCS7Padding、ISO10126d2Padding、X932Padding、ISO7816d4Padding、ZeroBytePadding BC

引入Bouncy Castle依賴:

<dependency>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcprov-jdk15</artifactId>
   <version>1.46</version>
</dependency>

引入Commons Codec依賴:

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.10</version>
</dependency>

Java程式碼實現:

import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DES {

  public static final String src = "des test";

  public static void main(String[] args) {
    jdkDES();
    bcDES();
  }

  // 用jdk實現:
  public static void jdkDES() {
    try {
      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
      keyGenerator.init(56);
      // 產生金鑰
      SecretKey secretKey = keyGenerator.generateKey();
      // 獲取金鑰
      byte[] bytesKey = secretKey.getEncoded();

      // KEY轉換
      DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
      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("jdk des encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("jdk des decrypt:" + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // 用bouncy castle實現:
  public static void bcDES() {
    try {
      Security.addProvider(new BouncyCastleProvider());

      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DES", "BC");
      keyGenerator.getProvider();
      keyGenerator.init(56);
      // 產生金鑰
      SecretKey secretKey = keyGenerator.generateKey();
      // 獲取金鑰
      byte[] bytesKey = secretKey.getEncoded();

      // KEY轉換
      DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
      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("bc des encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("bc des decrypt:" + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

3.對稱加密演算法-3DES

密碼學中,三重資料加密演算法(英語:Triple Data Encryption Algorithm,縮寫為TDEA,Triple DEA),或稱3DES(Triple DES),是一種對稱金鑰加密塊密碼,相當於是對每個資料塊應用三次資料加密標準(DES)演算法。由於計算機運算能力的增強,原版DES密碼的金鑰長度變得容易被暴力破解;3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的金鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。

Java程式碼實現:

import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DES3 {

  public static final String src = "3des test";

  public static void main(String[] args) {
    jdk3DES();
    bc3DES();
  }

  // 用jdk實現:
  public static void jdk3DES() {
    try {
      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
      // 必須長度是:112或168
//          keyGenerator.init(168);
      keyGenerator.init(new SecureRandom());
      // 產生金鑰
      SecretKey secretKey = keyGenerator.generateKey();
      // 獲取金鑰
      byte[] bytesKey = secretKey.getEncoded();

      // KEY轉換
      DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey);
      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(src.getBytes());
      System.out.println("jdk 3des encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("jdk 3des decrypt:" + new String(result));

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // 用bouncy castle實現:
  public static void bc3DES() {
    try {
      Security.addProvider(new BouncyCastleProvider());

      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede", "BC");
      keyGenerator.getProvider();
      keyGenerator.init(168);
      // 產生金鑰
      SecretKey secretKey = keyGenerator.generateKey();
      // 獲取金鑰
      byte[] bytesKey = secretKey.getEncoded();

      // KEY轉換
      DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey);
      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(src.getBytes());
      System.out.println("bc 3des encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("bc 3des decrypt:" + new String(result));

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

4.對稱加密演算法-AES

高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高階加密標準由美國國家標準與技術研究院(NIST)於2001年11月26日釋出於FIPS PUB 197,並在2002年5月26日成為有效的標準。2006年,高階加密標準已然成為對稱金鑰加密中最流行的演算法之一。

該演算法為比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以Rijndael為名投稿高階加密標準的甄選流程。(Rijndael的發音近於"Rhine doll")

金鑰長度 預設 工作模式 填充方式 實現方
128、192、256 128 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8到128、OFB、OFB8到128 NoPadding、PKCS5Padding、ISO10126Padding JDK(256位金鑰需要獲得無政策限制許可權檔案)
同上 同上 同上 PKCS7Padding、ZeroBytePadding BC

Java程式碼實現:

import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AES {

  public static final String src = "aes test";

  public static void main(String[] args) {
    jdkAES();
    bcAES();
  }

  // 用jdk實現:
  public static void jdkAES() {
    try {
      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
      keyGenerator.init(128);
      // 產生金鑰
      SecretKey secretKey = keyGenerator.generateKey();
      // 獲取金鑰
      byte[] keyBytes = secretKey.getEncoded();

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

      // 加密
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk aes encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, key);
      result = cipher.doFinal(result);
      System.out.println("jdk aes decrypt:" + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // 用bouncy castle實現:
  public static void bcAES() {
    try {
      Security.addProvider(new BouncyCastleProvider());

      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("AES", "BC");
      keyGenerator.getProvider();
      keyGenerator.init(128);
      // 產生金鑰
      SecretKey secretKey = keyGenerator.generateKey();
      // 獲取金鑰
      byte[] keyBytes = secretKey.getEncoded();

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

      // 加密
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("bc aes encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, key);
      result = cipher.doFinal(result);
      System.out.println("bc aes decrypt:" + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

應用舉例:

5.對稱加密演算法-PBE

PBE演算法(Password Based Encryption,基於口令加密)是一種基於口令的加密演算法,其特點是使用口令代替了金鑰,而口令由使用者自己掌管,採用隨機數雜湊多重加密等方法保證資料的安全性。

PBE演算法在加密過程中並不是直接使用口令來加密,而是加密的金鑰由口令生成,這個功能由PBE演算法中的KDF函式完成。KDF函式的實現過程為:將使用者輸入的口令首先通過“鹽”(salt)的擾亂產生準金鑰,再將準金鑰經過雜湊函式多次迭代後生成最終加密金鑰,金鑰生成後,PBE演算法再選用對稱加密演算法對資料進行加密,可以選擇DES、3DES、RC5等對稱加密演算法。

具體實現如下:

Java程式碼實現:

import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Hex;

public class PBE {

  public static final String src = "pbe test";

  public static void main(String[] args) {
    jdkPBE();
  }

  // 用jdk實現:
  public static void jdkPBE() {
    try {
      // 初始化鹽
      SecureRandom random = new SecureRandom();
      byte[] salt = random.generateSeed(8);

      // 口令與金鑰
      String password = "timliu";
      PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
      SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
      Key key = factory.generateSecret(pbeKeySpec);

      // 加密
      PBEParameterSpec pbeParameterSpac = new PBEParameterSpec(salt, 100);
      Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
      cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpac);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk pbe encrypt:" + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpac);
      result = cipher.doFinal(result);
      System.out.println("jdk pbe decrypt:" + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

應用舉例:

相關推薦

DES3DESAESPBE對稱加密演算法實現應用

1.對稱加密演算法概述 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。 在對稱加密

DHRSA與ElGamal非對稱加密演算法實現應用

1.對稱加密與非對稱加密概述 關於對稱加密與非對稱加密的概念這裡不再多說,感興趣可以看下我之前的幾篇文章,下面說一說兩者的主要區別。 對稱加密演算法資料安全,金鑰管理複雜,金鑰傳遞過程複雜,存在金鑰洩露問題。 非對稱加密演算法強度複雜、安全性依賴於演算法與金鑰。但是由於演算法複雜,使得非對稱演算法加解密速度沒

DES/3DES/AES 三種對稱加密演算法在 Java 中的實現

有兩句話是這麼說的:1)演算法和資料結構就是程式設計的一個重要部分,你若失掉了演算法和資料結構,你就把一切都失掉了。2)程式設計就是演算法和資料結構,演算法和資料結構是程式設計的靈魂。注意,這可不是我說的,是無數程式設計師總結的,話說的很實在也很精闢,若想長久可持續發展,多研

對稱加密過程詳解(基於RSA非對稱加密演算法實現

1、非對稱加密過程:         假如現實世界中存在A和B進行通訊,為了實現在非安全的通訊通道上實現資訊的保密性、完整性、可用性(即資訊保安的三個性質),A和B約定使用非對稱加密通道進行通訊,具體過程如下:   說明:         國內目前使用雙證書體系,即

JAVA 常用的加密演算法對稱加密DES3DESAES

1、對稱加密演算法 1.1 定義 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文(原始資料)和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰

DESAESRSAMD5加密演算法辨析與應用場景

資訊保安Cryptographic Techniques 對稱加密演算法 Data Encryption Standard(DES) DES 是一種典型的塊加密方法:將固定長度的明文通過一系列複雜的操作變成同樣長度的密文,塊的長度為64位。同時,DE

對稱加密演算法-DES,3DES,AES

1.jdk與bc實現DES演算法: package com.samlai.security; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.sec

DES 3DES AES Blowfish 對稱加密演算法比較

計算機加密技術分為對稱加密,及非對稱加密兩種技術. 對稱加密技術基本的實現是:資料傳送方和資料接收方共享一個金鑰,進行資料加密和解密工作。但是他也有個問題,就是一旦金鑰被第三方獲取,資料安全性就無法保證。 非對稱加密技術中,資料傳送方和接收方利用不同的金鑰進行資料加密及解密工作。簡言之,就是金鑰1只能

DES/3DES/AES區別 (對稱加密

 公元前400年,古希臘人發明了置換密碼。1881年世界上的第一個電話保密專利出現。在第二次世界大戰期間,德國軍方啟用“恩尼格瑪”密碼機,密碼學在戰爭中起著非常重要的作用。 DES   1977年1月,美國政府頒佈:採納IBM公司設計的方案作為非機密資料的正式資料

【IoT】加密與安全:非對稱加密演算法 RSA 1024 公鑰祕鑰明文和密文長度

RSA 1024 是指公鑰及私鑰分別是 1024bit,也就是 1024/8 = 128Bytes。 RSA 演算法金鑰長度的選擇是安全性和程式效能平衡的結果,金鑰長度越長,安全性越好,加密解密所需時間越長。 1、非對稱加密演算法中 1024bit 金鑰的強度相當於對稱加

SymmetricAlgorithmHelper對稱加密輔助類,支援DES3DESAES,RC2

理論上只要繼承自SymmetricAlgorithm的對稱加密演算法,該輔助類都支援加密解密,另外為了方便與JAVA互通,預設提供了ECB和CBC兩種加密模式、填充方式均為PKCS7的靜態方法 using System.Security.Cryptography;

Linux下批量部署(PxeKickstart實現應用

導讀: 作為運維經常會遇到一些重複的工作,例如:有時公司同時上線幾十甚至上百臺伺服器,而且需要我們在 短時間內完成系統安裝。本文主要講述了Linux下批量部署 Pxe、Kickstart實現及應用. 一、相關知識提要 1.理論知識 PXE : PXE(pre

JAVA傳送HTTP請求(postget),讀取HTTP響應內容,例項應用

JDK中提供了一些對無狀態協議請求(HTTP)的支援,下面我就將我所寫的一個小例子(元件)進行描述: 首先讓我們先構建一個請求類(HttpRequester)。 該類封裝了JAVA實現簡單請求的程式碼,如下: import java.io.BufferedReader;

常用對稱加密演算法DES/AES)類(PHP)

看註釋,啥也不說了,歡迎各種跨平臺測試! /** * 常用對稱加密演算法類 * 支援金鑰:64/128/256 bit(位元組長度8/16/32) * 支援演算法:DES/AES(根據金鑰長度自動匹配使用:DES:64bit AES:128/256bit) * 支

TrieTree字典樹資料結構的原理實現應用

一、基本知識 字典樹(TrieTree),又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。

MDSHAMAC訊息摘要演算法實現應用

1.訊息摘要概述 訊息摘要(Message Digest)又稱為數字摘要(Digital Digest)。它是一個唯一對應一個訊息或文字的固定長度的值,它由一個單向Hash加密函式對訊息進行作用而產生。如果訊息在途中改變了,則接收者通過對收到訊息的新產生的摘要與原摘要比較,就可知道訊息是否被改變了。因此訊息摘

AES/CBC/PKCS5Padding對稱加密

throw imp string base64 nbsp deb try encrypt java 1 package unit; 2 import javax.crypto.Cipher; 3 import javax.crypto.spec.IvParamete

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

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

對稱加密演算法AES 工具類,拿來可用

package com.xiaojukeji.visitor.common.util; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.No

AES 對稱加密演算法 加密\解密例項

package com.soufun.com; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuc