des演算法提供cbc, ofb, cfb, ecb四種模式,mac是基於ecb實現的。
一、資料補位
des資料加解密就是將資料按照8個位元組一段進行des加密或解密得到一段8個位元組的密文或者明文,最後一段不足8個位元組,按照需求補足8個位元組(通常補00或者ff,根據實際要求不同)進行計算,之後按照順序將計算所得的資料連在一起即可。
這裡有個問題就是為什麼要進行資料補位?主要原因是des演算法加解密時要求資料必須為8個位元組。
二、ecb模式
des ecb(電子密本方式)其實非常簡單,就是將資料按照8個位元組一段進行des加密或解密得到一段8個位元組的密文或者明文,最後一段不足8個位元組,按照需求補足8個位元組進行計算,之後按照順序將計算所得的資料連在一起即可,各段資料之間互不影響。
三、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即為解密結果。
這裡注意一點,解密的結果並不一定是我們原來的加密資料,可能還含有你補得位,一定要把補位去掉才是你的原來的資料。
*** des演算法
*/public class des catch (nosuchalgorithmexception e)
return null;
}/**
* 加密函式
** @param data
* 加密資料
* @param key
* 金鑰
* @return 返回加密後的資料
*/public static byte encrypt(byte data, byte key) catch (exception e)
return null;
}/**
* 解密函式
** @param data
* 解密資料
* @param key
* 金鑰
* @return 返回解密後的資料
*/public static byte decrypt(byte data, byte key) catch (exception e)
return null;
}/**
* 加密函式
** @param data
* 加密資料
* @param key
* 金鑰
* @return 返回加密後的資料
*/public static byte cbcencrypt(byte data, byte key, byte iv) catch (exception e)
return null;
}/**
* 解密函式
** @param data
* 解密資料
* @param key
* 金鑰
* @return 返回解密後的資料
*/public static byte cbcdecrypt(byte data, byte key, byte iv) catch (exception e)
return null;
}public static void main(string args) catch (exception e) }}
des的幾種填補方式
des是對64位資料的加密演算法,如資料位數不足64位的倍數,需要填充,補充到64位的倍數。
nopadding
api或演算法本身不對資料進行處理,加密資料由加密雙方約定填補演算法。例如若對字串資料進行加解密,可以補充\0或者空格,然後trim
pkcs5padding
加密前:資料位元組長度對8取餘,餘數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8
解密後:取最後乙個位元組,值為m,則從資料尾部刪除m個位元組,剩餘資料即為加密前的原文
因為des是一種block cipher,乙個block要8個位元組,所以要加密的東西要分成8位元組的整數倍,不足的就填充。
pkcs5padding這種填充,填的位元組代表所填位元組的總數:
比如差三個位元組的話填為 @@@@@333
差7個位元組就填為 @7777777
沒有差就填 88888888
DES 資料加密標準 結構詳解
data encryption standard,又稱資料加密標準,是一種對稱加密演算法,也是密碼學擺脫古典流加密後最簡單的一種塊加密演算法。由於夏農與1949年提出 完善保密性 該標準要求金鑰長度不短於明文長度,實際操作難以達到,因此des使用了塊加密,選擇犧牲一定程度的 完善保密性 來降低金鑰的...
MD5加密 DES加密,DES解密
public class pgsecret region des加密 des加密 要加密的字串。金鑰,且必須為8位。以base64格式返回的加密字串。endregion public static string desencrypt string sztoencrypt,string szkey s...
Go語言中操作DES加密詳解
下面我們來看一下 實現 package main import crypto des crypto cipher fmt bytes encoding base64 des加密解密 des的cbc模式加密函式 src 明文 key 金鑰,大小為8byte func desencrypt cbc sr...