Des加密理解

來源:互聯網
上載者:User

DES全稱為Data EncryptionStandard,即資料加密標準。Des密碼編譯演算法是一種對稱式加密演算法,所謂對稱式加密演算法就是指對明文的加密以及對密文的解密用的是同一個密鑰。

Des使用一個56位的密鑰以及附加的8位同位位元,產生最大64位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文字區塊分成兩半。使用子金鑰組其中一半應用迴圈功能,然後將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去,但最後一個迴圈不交換。DES 使用 16 個迴圈,使用異或,置換,代換,移位操作四種基本運算。

特點:資料加密標準,速度較快,適用於加密大量資料的場合。

Des演算法的入口參數有三個:Key、Data、Mode。

Key: 為8個位元組共64位,Des演算法規定,其中第8、16、24、......64位是同位位元,不參與Des運算,所以常說Des的密鑰為56位。 在Des加密和解密的過程當中,密鑰的長度都必須是8位元組的倍數。

Data: 8個位元組64位,是要被加密後解密的資料。

Mode: Des的工作方式:加密、解密。 Des加密模式

Des的加密模式主要有CBC模式,ECB模式,它們分別使用不同的加密方式加密。

ECB模式指的是電子密碼本模式,是一種最古老,最簡單的模式,將加密的資料分成若干組,每組的大小跟加密金鑰長度相同;然後每組都用相同的祕密金鑰加密, 如果最後一個分組長度不夠64位,要補齊64位。 ECB模式的特點是:

每次Key、明文、密文的長度都必須是64位;

資料區塊重複排序不需要檢測;

相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊;

一個錯誤僅僅會對一個密文塊產生影響;

CBC模式指的是加密塊鏈模式,與ECB模式最大的不同是加入了初始向量。 CBC模式的特點是:

每次加密的密文長度為64位(8個位元組);

當相同的明文使用相同的密鑰和初始向量的時候CBC模式總是產生相同的密文;

密文塊要依賴以前的操作結果,所以,密文塊不能進行重新排列;

可以使用不同的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊;

一個錯誤發生以後,當前和以後的密文都會被影響; 填充方式

常見的填充方式PKCS5Padding,PKCS5Padding表示當資料位元數不足的時候要採用的資料補齊方式,也可以叫做資料填充方式。PKCS5Padding這種填充方式,具體來說就是“填充的數字代表所填位元組的總數”

比如說,差兩個位元組,就是######22,差5個位元組就是###55555,這樣根據最後一個自己就可以知道填充的數字和數量。 保證加密解密的一致性 

在不同的平台上,只要能保證這幾個參數的一致,就可以實現加密和解密的一致性。

加密和解密的密鑰一致

採用CBC模式的時候,要保證初始向量一致

採用相同的填充模式
/**
* 加密
* 
* @param data
* @param sKey
* @return
*/
public static byte[] encrypt(byte[] data, String sKey) {
try {
byte[] key = sKey.getBytes();
// 初始化向量
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(key);
// 建立一個密匙工廠,然後用它把DESKeySpec轉換成SecretKey
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher對象實際完成加密操作
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
// 用密匙初始化Cipher對象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
// 現在,擷取資料並加密
// 正式執行加密操作
return cipher.doFinal(data);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}


/**
* 解密
* 
* @param src
* @param sKey
* @return
* @throws Exception
*/
public static byte[] decrypt(byte[] src, String sKey) throws Exception {
byte[] key = sKey.getBytes();
// DES演算法要求有一個可信任的隨機數源
SecureRandom random = new SecureRandom();
// 建立一個DESKeySpec對象
DESKeySpec desKey = new DESKeySpec(key);
// 建立一個密匙工廠
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 將DESKeySpec對象轉換成SecretKey對象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher對象實際完成解密操作
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
// 用密匙初始化Cipher對象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正開始解密操作
return cipher.doFinal(src);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.