成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DES、3DES、AES、PBE對(duì)稱加密算法實(shí)現(xiàn)及應(yīng)用

安全 數(shù)據(jù)安全 算法
對(duì)稱加密算法是應(yīng)用較早的加密算法,技術(shù)成熟。在對(duì)稱加密算法中,數(shù)據(jù)發(fā)信方將明文和加密密鑰一起經(jīng)過(guò)特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去。

 [[272601]]

1.對(duì)稱加密算法概述

對(duì)稱加密算法是應(yīng)用較早的加密算法,技術(shù)成熟。在對(duì)稱加密算法中,數(shù)據(jù)發(fā)信方將明文和加密密鑰一起經(jīng)過(guò)特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去。收信方收到密文后,若想解讀原文,則需要使用加密用過(guò)的密鑰及相同算法的逆算法對(duì)密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。

在對(duì)稱加密算法中,使用的密鑰只有一個(gè),發(fā)收信雙方都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密,這就要求解密方事先必須知道加密密鑰。

對(duì)稱加密算法的特點(diǎn)是算法公開、計(jì)算量小、加密速度快、加密效率高。

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

在計(jì)算機(jī)系統(tǒng)中廣泛使用的對(duì)稱加密算法有DES和IDEA等。因?yàn)镈ES近年來(lái)屢屢被破解,所以,美國(guó)國(guó)家標(biāo)準(zhǔn)局倡導(dǎo)的AES即將作為新標(biāo)準(zhǔn)取代DES。

2.對(duì)稱加密算法-DES

DES算法為密碼體制中的對(duì)稱密碼體制,又被稱為美國(guó)數(shù)據(jù)加密標(biāo)準(zhǔn),是1972年美國(guó)IBM公司研制的對(duì)稱密碼體制加密算法。

明文按64位進(jìn)行分組,密鑰長(zhǎng)64位,密鑰事實(shí)上是56位參與DES運(yùn)算(第8、16、24、32、40、48、56、64位是校驗(yàn)位, 使得每個(gè)密鑰都有奇數(shù)個(gè)1)分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。

引入Bouncy Castle依賴:

  1. <dependency> 
  2.    <groupId>org.bouncycastle</groupId> 
  3.    <artifactId>bcprov-jdk15</artifactId> 
  4.    <version>1.46</version> 
  5. </dependency> 

引入Commons Codec依賴:

  1. <dependency> 
  2.    <groupId>commons-codec</groupId> 
  3.    <artifactId>commons-codec</artifactId> 
  4.    <version>1.10</version> 
  5. </dependency> 

Java代碼實(shí)現(xiàn):

  1. import java.security.Key
  2. import java.security.Security; 
  3. import javax.crypto.Cipher; 
  4. import javax.crypto.KeyGenerator; 
  5. import javax.crypto.SecretKey; 
  6. import javax.crypto.SecretKeyFactory; 
  7. import javax.crypto.spec.DESKeySpec; 
  8. import org.apache.commons.codec.binary.Hex; 
  9. import org.bouncycastle.jce.provider.BouncyCastleProvider; 
  10.  
  11. public class DES { 
  12.  
  13.   public static final String src = "des test"
  14.  
  15.   public static void main(String[] args) { 
  16.     jdkDES(); 
  17.     bcDES(); 
  18.   } 
  19.  
  20.   // 用jdk實(shí)現(xiàn): 
  21.   public static void jdkDES() { 
  22.     try { 
  23.       // 生成KEY 
  24.       KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); 
  25.       keyGenerator.init(56); 
  26.       // 產(chǎn)生密鑰 
  27.       SecretKey secretKey = keyGenerator.generateKey(); 
  28.       // 獲取密鑰 
  29.       byte[] bytesKey = secretKey.getEncoded(); 
  30.  
  31.       // KEY轉(zhuǎn)換 
  32.       DESKeySpec desKeySpec = new DESKeySpec(bytesKey); 
  33.       SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); 
  34.       Key convertSecretKey = factory.generateSecret(desKeySpec); 
  35.  
  36.       // 加密 
  37.       Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
  38.       cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); 
  39.       byte[] result = cipher.doFinal(src.getBytes()); 
  40.       System.out.println("jdk des encrypt:" + Hex.encodeHexString(result)); 
  41.  
  42.       // 解密 
  43.       cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); 
  44.       result = cipher.doFinal(result); 
  45.       System.out.println("jdk des decrypt:" + new String(result)); 
  46.     } catch (Exception e) { 
  47.       e.printStackTrace(); 
  48.     } 
  49.   } 
  50.  
  51.   // 用bouncy castle實(shí)現(xiàn): 
  52.   public static void bcDES() { 
  53.     try { 
  54.       Security.addProvider(new BouncyCastleProvider()); 
  55.  
  56.       // 生成KEY 
  57.       KeyGenerator keyGenerator = KeyGenerator.getInstance("DES""BC"); 
  58.       keyGenerator.getProvider(); 
  59.       keyGenerator.init(56); 
  60.       // 產(chǎn)生密鑰 
  61.       SecretKey secretKey = keyGenerator.generateKey(); 
  62.       // 獲取密鑰 
  63.       byte[] bytesKey = secretKey.getEncoded(); 
  64.  
  65.       // KEY轉(zhuǎn)換 
  66.       DESKeySpec desKeySpec = new DESKeySpec(bytesKey); 
  67.       SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); 
  68.       Key convertSecretKey = factory.generateSecret(desKeySpec); 
  69.  
  70.       // 加密 
  71.       Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
  72.       cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); 
  73.       byte[] result = cipher.doFinal(src.getBytes()); 
  74.       System.out.println("bc des encrypt:" + Hex.encodeHexString(result)); 
  75.  
  76.       // 解密 
  77.       cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); 
  78.       result = cipher.doFinal(result); 
  79.       System.out.println("bc des decrypt:" + new String(result)); 
  80.     } catch (Exception e) { 
  81.       e.printStackTrace(); 
  82.     } 
  83.   } 

 

應(yīng)用例子:

 

3.對(duì)稱加密算法-3DES

密碼學(xué)中,三重?cái)?shù)據(jù)加密算法(英語(yǔ):Triple Data Encryption Algorithm,縮寫為TDEA,Triple DEA),或稱3DES(Triple DES),是一種對(duì)稱密鑰加密塊密碼,相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)算法。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版DES密碼的密鑰長(zhǎng)度變得容易被暴力破解;3DES即是設(shè)計(jì)用來(lái)提供一種相對(duì)簡(jiǎn)單的方法,即通過(guò)增加DES的密鑰長(zhǎng)度來(lái)避免類似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法。

Java代碼實(shí)現(xiàn):

  1. import java.security.Key
  2. import java.security.SecureRandom; 
  3. import java.security.Security; 
  4. import javax.crypto.Cipher; 
  5. import javax.crypto.KeyGenerator; 
  6. import javax.crypto.SecretKey; 
  7. import javax.crypto.SecretKeyFactory; 
  8. import javax.crypto.spec.DESedeKeySpec; 
  9. import org.apache.commons.codec.binary.Hex; 
  10. import org.bouncycastle.jce.provider.BouncyCastleProvider; 
  11.  
  12. public class DES3 { 
  13.  
  14.   public static final String src = "3des test"
  15.  
  16.   public static void main(String[] args) { 
  17.     jdk3DES(); 
  18.     bc3DES(); 
  19.   } 
  20.  
  21.   // 用jdk實(shí)現(xiàn): 
  22.   public static void jdk3DES() { 
  23.     try { 
  24.       // 生成KEY 
  25.       KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); 
  26.       // 必須長(zhǎng)度是:112或168 
  27. //            keyGenerator.init(168); 
  28.       keyGenerator.init(new SecureRandom()); 
  29.       // 產(chǎn)生密鑰 
  30.       SecretKey secretKey = keyGenerator.generateKey(); 
  31.       // 獲取密鑰 
  32.       byte[] bytesKey = secretKey.getEncoded(); 
  33.  
  34.       // KEY轉(zhuǎn)換 
  35.       DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey); 
  36.       SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); 
  37.       Key convertSecretKey = factory.generateSecret(desKeySpec); 
  38.  
  39.       // 加密 
  40.       Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
  41.       cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); 
  42.       byte[] result = cipher.doFinal(src.getBytes()); 
  43.       System.out.println("jdk 3des encrypt:" + Hex.encodeHexString(result)); 
  44.  
  45.       // 解密 
  46.       cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); 
  47.       result = cipher.doFinal(result); 
  48.       System.out.println("jdk 3des decrypt:" + new String(result)); 
  49.  
  50.     } catch (Exception e) { 
  51.       e.printStackTrace(); 
  52.     } 
  53.   } 
  54.  
  55.   // 用bouncy castle實(shí)現(xiàn): 
  56.   public static void bc3DES() { 
  57.     try { 
  58.       Security.addProvider(new BouncyCastleProvider()); 
  59.  
  60.       // 生成KEY 
  61.       KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede""BC"); 
  62.       keyGenerator.getProvider(); 
  63.       keyGenerator.init(168); 
  64.       // 產(chǎn)生密鑰 
  65.       SecretKey secretKey = keyGenerator.generateKey(); 
  66.       // 獲取密鑰 
  67.       byte[] bytesKey = secretKey.getEncoded(); 
  68.  
  69.       // KEY轉(zhuǎn)換 
  70.       DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey); 
  71.       SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); 
  72.       Key convertSecretKey = factory.generateSecret(desKeySpec); 
  73.  
  74.       // 加密 
  75.       Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
  76.       cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); 
  77.       byte[] result = cipher.doFinal(src.getBytes()); 
  78.       System.out.println("bc 3des encrypt:" + Hex.encodeHexString(result)); 
  79.  
  80.       // 解密 
  81.       cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); 
  82.       result = cipher.doFinal(result); 
  83.       System.out.println("bc 3des decrypt:" + new String(result)); 
  84.  
  85.     } catch (Exception e) { 
  86.       e.printStackTrace(); 
  87.     } 
  88.   } 

4.對(duì)稱加密算法-AES

高級(jí)加密標(biāo)準(zhǔn)(英語(yǔ):Advanced Encryption Standard,縮寫:AES),在密碼學(xué)中又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過(guò)五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一。

該算法為比利時(shí)密碼學(xué)家Joan Daemen和Vincent Rijmen所設(shè)計(jì),結(jié)合兩位作者的名字,以Rijndael為名投稿高級(jí)加密標(biāo)準(zhǔn)的甄選流程。(Rijndael的發(fā)音近于"Rhine doll")

Java代碼實(shí)現(xiàn):

  1. import java.security.Key
  2. import java.security.Security; 
  3. import javax.crypto.Cipher; 
  4. import javax.crypto.KeyGenerator; 
  5. import javax.crypto.SecretKey; 
  6. import javax.crypto.spec.SecretKeySpec; 
  7. import org.apache.commons.codec.binary.Hex; 
  8. import org.bouncycastle.jce.provider.BouncyCastleProvider; 
  9.  
  10. public class AES { 
  11.  
  12.   public static final String src = "aes test"
  13.  
  14.   public static void main(String[] args) { 
  15.     jdkAES(); 
  16.     bcAES(); 
  17.   } 
  18.  
  19.   // 用jdk實(shí)現(xiàn): 
  20.   public static void jdkAES() { 
  21.     try { 
  22.       // 生成KEY 
  23.       KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); 
  24.       keyGenerator.init(128); 
  25.       // 產(chǎn)生密鑰 
  26.       SecretKey secretKey = keyGenerator.generateKey(); 
  27.       // 獲取密鑰 
  28.       byte[] keyBytes = secretKey.getEncoded(); 
  29.  
  30.       // KEY轉(zhuǎn)換 
  31.       Key key = new SecretKeySpec(keyBytes, "AES"); 
  32.  
  33.       // 加密 
  34.       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
  35.       cipher.init(Cipher.ENCRYPT_MODE, key); 
  36.       byte[] result = cipher.doFinal(src.getBytes()); 
  37.       System.out.println("jdk aes encrypt:" + Hex.encodeHexString(result)); 
  38.  
  39.       // 解密 
  40.       cipher.init(Cipher.DECRYPT_MODE, key); 
  41.       result = cipher.doFinal(result); 
  42.       System.out.println("jdk aes decrypt:" + new String(result)); 
  43.     } catch (Exception e) { 
  44.       e.printStackTrace(); 
  45.     } 
  46.   } 
  47.  
  48.   // 用bouncy castle實(shí)現(xiàn): 
  49.   public static void bcAES() { 
  50.     try { 
  51.       Security.addProvider(new BouncyCastleProvider()); 
  52.  
  53.       // 生成KEY 
  54.       KeyGenerator keyGenerator = KeyGenerator.getInstance("AES""BC"); 
  55.       keyGenerator.getProvider(); 
  56.       keyGenerator.init(128); 
  57.       // 產(chǎn)生密鑰 
  58.       SecretKey secretKey = keyGenerator.generateKey(); 
  59.       // 獲取密鑰 
  60.       byte[] keyBytes = secretKey.getEncoded(); 
  61.  
  62.       // KEY轉(zhuǎn)換 
  63.       Key key = new SecretKeySpec(keyBytes, "AES"); 
  64.  
  65.       // 加密 
  66.       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
  67.       cipher.init(Cipher.ENCRYPT_MODE, key); 
  68.       byte[] result = cipher.doFinal(src.getBytes()); 
  69.       System.out.println("bc aes encrypt:" + Hex.encodeHexString(result)); 
  70.  
  71.       // 解密 
  72.       cipher.init(Cipher.DECRYPT_MODE, key); 
  73.       result = cipher.doFinal(result); 
  74.       System.out.println("bc aes decrypt:" + new String(result)); 
  75.     } catch (Exception e) { 
  76.       e.printStackTrace(); 
  77.     } 
  78.   } 

5.對(duì)稱加密算法-PBE

PBE算法(Password Based Encryption,基于口令加密)是一種基于口令的加密算法,其特點(diǎn)是使用口令代替了密鑰,而口令由用戶自己掌管,采用隨機(jī)數(shù)雜湊多重加密等方法保證數(shù)據(jù)的安全性。

PBE算法在加密過(guò)程中并不是直接使用口令來(lái)加密,而是加密的密鑰由口令生成,這個(gè)功能由PBE算法中的KDF函數(shù)完成。KDF函數(shù)的實(shí)現(xiàn)過(guò)程為:將用戶輸入的口令首先通過(guò)“鹽”(salt)的擾亂產(chǎn)生準(zhǔn)密鑰,再將準(zhǔn)密鑰經(jīng)過(guò)散列函數(shù)多次迭代后生成最終加密密鑰,密鑰生成后,PBE算法再選用對(duì)稱加密算法對(duì)數(shù)據(jù)進(jìn)行加密,可以選擇DES、3DES、RC5等對(duì)稱加密算法。

具體實(shí)現(xiàn)如下:

Java代碼實(shí)現(xiàn):

  1. import java.security.Key
  2. import java.security.SecureRandom; 
  3. import javax.crypto.Cipher; 
  4. import javax.crypto.SecretKeyFactory; 
  5. import javax.crypto.spec.PBEKeySpec; 
  6. import javax.crypto.spec.PBEParameterSpec; 
  7. import org.apache.commons.codec.binary.Hex; 
  8.  
  9. public class PBE { 
  10.  
  11.   public static final String src = "pbe test"
  12.  
  13.   public static void main(String[] args) { 
  14.     jdkPBE(); 
  15.   } 
  16.  
  17.   // 用jdk實(shí)現(xiàn): 
  18.   public static void jdkPBE() { 
  19.     try { 
  20.       // 初始化鹽 
  21.       SecureRandom random = new SecureRandom(); 
  22.       byte[] salt = random.generateSeed(8); 
  23.  
  24.       // 口令與密鑰 
  25.       String password = "timliu"
  26.       PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray()); 
  27.       SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES"); 
  28.       Key key = factory.generateSecret(pbeKeySpec); 
  29.  
  30.       // 加密 
  31.       PBEParameterSpec pbeParameterSpac = new PBEParameterSpec(salt, 100); 
  32.       Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES"); 
  33.       cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpac); 
  34.       byte[] result = cipher.doFinal(src.getBytes()); 
  35.       System.out.println("jdk pbe encrypt:" + Hex.encodeHexString(result)); 
  36.  
  37.       // 解密 
  38.       cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpac); 
  39.       result = cipher.doFinal(result); 
  40.       System.out.println("jdk pbe decrypt:" + new String(result)); 
  41.     } catch (Exception e) { 
  42.       e.printStackTrace(); 
  43.     } 
  44.   } 

應(yīng)用舉例:

 

責(zé)任編輯:武曉燕 來(lái)源: 薛勤的博客
相關(guān)推薦

2011-06-22 14:00:22

2011-06-22 11:04:25

加密ARM3DES

2023-07-30 17:44:24

CryptoJS加密字符串

2010-09-08 16:01:33

加密算法協(xié)議

2023-08-01 07:24:05

2009-08-13 18:12:11

C#數(shù)據(jù)加密

2009-08-04 11:08:33

ASP.NET數(shù)據(jù)加密

2012-05-21 23:53:21

Java.NETDES加密

2023-08-02 07:27:53

2024-12-31 08:00:00

SpringBoot開發(fā)加密

2010-07-28 10:09:01

2011-08-18 12:12:29

2023-12-13 12:27:46

2009-09-04 16:45:44

C# DES算法加密解

2018-07-10 10:29:27

2015-03-26 11:25:10

對(duì)稱加密加密壓縮加密解密解壓

2020-12-11 06:41:15

AES加密

2022-01-11 12:12:10

加密漏洞攻擊

2024-08-26 08:34:47

AES加密算法

2020-05-27 10:10:56

對(duì)稱加密Hash算法數(shù)字簽名
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产综合精品一区二区三区 | 岛国在线免费观看 | 日韩快播电影 | 户外露出一区二区三区 | 日韩欧美三级电影 | 精品成人 | 成人午夜免费福利视频 | 午夜精品一区二区三区在线播放 | 亚洲成人网在线 | 四虎影院在线播放 | 女人精96xxx免费网站p | 日韩精品一区二区在线观看 | 亚洲一区有码 | 日本超碰| 黄色一级片aaa | 久久成人国产 | 中国一级大毛片 | 免费在线观看一区二区三区 | 女同久久另类99精品国产 | 国产乱一区二区三区视频 | 精品国产高清一区二区三区 | 91精品国产综合久久婷婷香蕉 | 亚洲日韩视频 | 日韩成人免费在线视频 | 国产高清视频 | 欧美一区二区三区小说 | 欧美国产日本一区 | 欧美精品1区 | 中文字幕不卡在线观看 | 精久久久久 | 免费观看日韩av | 午夜免费看| 在线日韩视频 | 亚洲久在线 | 国产高清在线 | 中文字幕一区二区三区精彩视频 | 成人在线欧美 | 欧美一区免费 | 日本网站免费在线观看 | 婷婷桃色网 | 国产第1页 |