文章1:
java
這一篇文章要解決數據加密——數據補位的問題、DES算法的兩種模式ECB和CBC問題以及更加安全的算法——3DES算法。web
1、數據補位 DES數據加解密就是將數據按照8個字節一段進行DES加密或解密獲得一段8個字節的密文或者明文,最後一段不足8個字節,按照需求補足8個字節(一般補00或者FF,根據實際要求不一樣)進行計算,以後按照順序將計算所得的數據連在一塊兒便可。 這裏有個問題就是爲何要進行數據補位?主要緣由是DES算法加解密時要求數據必須爲8個字節。 算法
2、ECB模式 DES ECB(電子密本方式)其實很是簡單,就是將數據按照8個字節一段進行DES加密或解密獲得一段8個字節的密文或者明文,最後一段不足8個字節,按照需求補足8個字節進行計算,以後按照順序將計算所得的數據連在一塊兒便可,各段數據之間互不影響。安全
3、CBC模式 DES CBC(密文分組連接方式)有點麻煩,它的實現機制使加密的各段數據之間有了聯繫。其實現的機理以下: 加密步驟以下: 1)首先將數據按照8個字節一組進行分組獲得D1D2......Dn(若數據不是8的整數倍,用指定的PADDING數據補位) 2)第一組數據D1與初始化向量I異或後的結果進行DES加密獲得第一組密文C1(初始化向量I爲全零) 3)第二組數據D2與第一組的加密結果C1異或之後的結果進行DES加密,獲得第二組密文C2 4)以後的數據以此類推,獲得Cn 5)按順序連爲C1C2C3......Cn即爲加密結果。 解密是加密的逆過程,步驟以下: 1)首先將數據按照8個字節一組進行分組獲得C1C2C3......Cn 2)將第一組數據進行解密後與初始化向量I進行異或獲得第一組明文D1(注意:必定是先解密再異或) 3)將第二組數據C2進行解密後與第一組密文數據進行異或獲得第二組數據D2 4)以後依此類推,獲得Dn 5)按順序連爲D1D2D3......Dn即爲解密結果。 這裏注意一點,解密的結果並不必定是咱們原來的加密數據,可能還含有你補得位,必定要把補位去掉纔是你的原來的數據。 網絡
4、3DES 算法 3DES算法顧名思義就是3次DES算法,其算法原理以下: 設Ek()和Dk()表明DES算法的加密和解密過程,K表明DES算法使用的密鑰,P表明明文,C表明密表,這樣, 3DES加密過程爲:C=Ek3(Dk2(Ek1(P))) 3DES解密過程爲:P=Dk1((EK2(Dk3(C))) 這裏能夠K1=K3,但不能K1=K2=K3(若是相等的話就成了DES算法了) 3DES with 2 diffrent keys(K1=K3),能夠是3DES-CBC,也能夠是3DES-ECB,3DES-CBC整個算法的流程和DES-CBC同樣,可是在原來的加密或者解密處增長了異或運算的步驟,使用的密鑰是16字節長度的密鑰,將密鑰分紅左8字節和右8字節的兩部分,即k1=左8字節,k2=右8字節,而後進行加密運算和解密運算。 3DES with 3 different keys,和3DES-CBC的流程徹底同樣,只是使用的密鑰是24字節的,但在每一個加密解密加密時候用的密鑰不同,將密鑰分爲3段8字節的密鑰分別爲密鑰一、密鑰二、密鑰3,在3DES加密時對加密解密加密依次使用密鑰一、密鑰二、密鑰3,在3DES解密時對解密加密解密依次使用密鑰三、密鑰二、密鑰1。ide
文章2:測試
DES加密
1977年1月,美國政府頒佈:採納IBM公司設計的方案做爲非機密數據的正式數據加密標準(DES Data Encryption Standard) 。spa
目前在國內,隨着三金工程尤爲是金卡工程的啓動,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領域被普遍應用,以此來實現關鍵數據的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數據包的MAC校驗等,均用到DES算法。.net
DES算法的入口參數有三個:Key、Data、Mode。
其中Key爲8個字節共64位,是DES算法的工做密鑰;
Data也爲8個字節64位,是要被加密或被解密的數據;
Mode爲DES的工做方式,有兩種:加密或解密。
DES算法是這樣工做的:
如Mode爲加密,則用Key 去把數據Data進行加密, 生成Data的密碼形式(64位)做爲DES的輸出結果;
如Mode爲解密,則用Key去把密碼形式的數據Data解密,還原爲Data的明碼形式(64位)做爲DES的輸出結果。
在通訊網絡的兩端,雙方約定一致的Key,在通訊的源點用Key對核心數據進行DES加密,而後以密碼形式在公共通訊網(如電話網)中傳輸到通訊網絡的終點,數據到達目的地後,用一樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通訊網中傳輸的安全性和可靠性。
經過按期在通訊網絡的源端和目的端同時改用新的Key,便能更進一步提升數據的保密性,這正是如今金融交易網絡的流行作法。
3DES
3DES是DES加密算法的一種模式,它使用3條64位的密鑰對數據進行三次加密。數據加密標準(DES)是美國的一種由來已久的加密標準,它使用對稱密鑰加密法。
3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定爲過渡的加密標準),是DES的一個更安全的變形。它以DES爲基本模塊,經過組合分組方法設計出分組加密算法。
設Ek()和Dk()表明DES算法的加密和解密過程,K表明DES算法使用的密鑰,P表明明文,C表明密表,這樣,
3DES加密過程爲:C=Ek3(Dk2(Ek1(P)))
3DES解密過程爲:P=Dk1((EK2(Dk3(C)))
K一、K二、K3決定了算法的安全性,若三個密鑰互不相同,本質上就至關於用一個長爲168位的密鑰進行加密。多年來,它在對付強力攻擊時是比較安全的。若數據對安全性要求不那麼高,K1能夠等於K3。在這種狀況下,密鑰的有效長度爲112位。
AES
AES(Advanced Encryption Standard):高級加密標準,是下一代的加密算法標準,速度快,安全級別高。
用AES加密2000年10月,NIST(美國國家標準和技術協會)宣佈經過從15種候選算法中選出的一項新的密匙加密標準。Rijndael被選中成爲未來的 AES。Rijndael是在1999年下半年,由研究員Joan Daemen 和 Vincent Rijmen 建立的。AES正日益成爲加密各類形式的電子數據的實際標準。
美國標準與技術研究院(NIST)於2002年5月26日製定了新的高級加密標準(AES)規範。
AES算法基於排列和置換運算。排列是對數據從新進行安排,置換是將一個數據單元替換爲另外一個。
AES使用幾種不一樣的方法來執行排列和置換運算。AES是一個迭代的、對稱密鑰分組的密碼,它可使用128、192和256位密鑰,而且用128位(16字節)分組加密和解密數據。
與公共密鑰加密使用密鑰對不一樣,對稱密鑰密碼使用相同的密鑰加密和解密數據。經過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重複置換和替換輸入數據。
推薦文章:
http://blog.csdn.net/zixu/article/details/1204298
package mai.util;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class ThreeDES {
private static final String Algorithm = "DESede"; //定義 加密算法,可用 DES,DESede,Blowfish
//keybyte爲加密密鑰,長度爲24字節
//src爲被加密的數據緩衝區(源)
public static byte[] encryptMode(byte[] keybyte, byte[] src) {
try {
//生成密鑰
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
//keybyte爲加密密鑰,長度爲24字節
//src爲加密後的緩衝區
public static byte[] decryptMode(byte[] keybyte, byte[] src) {
try {
//生成密鑰
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
//轉換成十六進制字符串
public static String byte2hex(byte[] b) {
String hs="";
String stmp="";
for (int n=0;n<b.length;n++) {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
public static void main(String[] args)
{
//添加新安全算法,若是用JCE就要把它添加進去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte)0x88, 0x10, 0x40, 0x38
, 0x28, 0x25, 0x79, 0x51, (byte)0xCB, (byte)0xDD, 0x55, 0x66
, 0x77, 0x29, 0x74, (byte)0x98, 0x30, 0x40, 0x36, (byte)0xE2}; //24字節的密鑰
String szSrc = "This is a 3DES test. 測試";
System.out.println("加密前的字符串:" + szSrc);
byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());
System.out.println("加密後的字符串:" + new String(encoded));
byte[] srcBytes = decryptMode(keyBytes, encoded);
System.out.println("解密後的字符串:" + (new String(srcBytes))); }}