當前位置:成語大全網 - 新華字典 - 大家好,有VC++ DES-CBC代碼嗎,VB也成,要CBC模式的

大家好,有VC++ DES-CBC代碼嗎,VB也成,要CBC模式的

DES加密模式詳解

互聯網的軟件設計壹定少不了加密算法,並且大量使用的都會是對稱加密,比較常見的對稱加密有:DES、3DES、RC4、AES等等;

加密算法都有幾個***同的要點:

密鑰長度;(關系到密鑰的強度)

加密模式;(ecb、cbc等等)

塊加密算法裏的填充方式區分;

對於加密模式,很多同學還不清楚,比如DES,也會有ECB、CBC等不同的區分,它們都是標準的;

Windows加密庫中,默認則是CBC模式,也可以手工設置;

Openssl庫要更明顯壹點,它的函數名裏面就寫明了,比如:DES_ncbc_encrypt,壹看就知道是cbc模式;

JAVA裏面也比較清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式

各種加密模式有什麽不同呢:(為了方便,這裏的加密key都取64位)

電子密碼本模式ECB:

最古老,最簡單的模式,將加密的數據分成若幹組,每組的大小跟加密密鑰長度相同;

然後每組都用相同的密鑰加密, 比如DES算法, 如果最後壹個分組長度不夠64位,要補齊64位;

定義:

Enc(X,Y)是加密函數

Dec(X,Y)是解密函數

Key是加密密鑰;

Pi ( i = 0,1…n)是明文塊,大小為64bit;

Ci ( i = 0,1…n)是密文塊,大小為64bit;

ECB加密算法可表示為:

Ci = Enc(Key, Pi)

ECB解密算法可以表示為:

Pi = Dec(Key,Ci)

算法 特點:

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

數據塊重復排序不需要檢測;

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

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

加密塊鏈模式CBC:

與ECB模式最大的不同是加入了初始向量

定義:

Enc(X,Y)是加密函數

Dec(X,Y)是解密函數

Key是加密密鑰;

Pi ( i = 0,1…n)是明文塊,大小為64bit;

Ci ( i = 0,1…n)是密文塊,大小為64bit;

XOR(X,Y)是異或運算;

IV是初始向量(壹般為64位);

ECB加密算法可表示為:

C0 = Enc(Key, XOR(IV, P0)

Ci = Enc(Key, XOR(Ci-1, Pi)

ECB解密算法可以表示為:

P0 = XOR(IV, Dec(Key, C0))

Pi = XOR(Ci-1, Dec(Key,Ci))

算法特點:

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

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

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

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

壹個錯誤發生以後,當前和以後的密文都會被影響;

加密反饋模式CFB:

加密反饋模式克服了需要等待8個字節才能加密的缺點,它采用了分組密碼作為流密碼的密鑰流生成器;

定義:

Enc(X,Y)是加密函數

Dec(X,Y)是解密函數

Key是加密密鑰;

Pi ( i = 0,1…n)是明文塊,大小為64bit;

Ci ( i = 0,1…n)是密文塊,大小為64bit;

Si ( i = 0,1…n),大小為8bit,n個連續的Si組成加密位移寄存器,壹般n=8;

Oi = Enc(Key, Si);

Lef(x) 為取數據x的最左8個bit位;

A(x,y)為合並x左移8位,空位用y填充

CFB加密算法可表示為:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Ci);

CFB解密算法可表示為:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Ci);

圖示:

特點:

每次加密的Pi和Ci不大於64位;

加密算法和解密算法相同,不能適用於公鑰算法;

使用相同的密鑰和初始向量的時候,相同明文使用CFB模式加密輸出相同的密文;

可以使用不同的初始化變量使相同的明文產生不同的密文,防止字典攻擊;

加密強度依賴於密鑰長度;

加密塊長度過小時,會增加循環的數量,導致開銷增加;

加密塊長度應時8位的整數倍(即字節為單位);

壹旦某位數據出錯,會影響目前和其後8個塊的數據;

輸出反饋模式OFB:

與CFB模式不同之處在於, 加密位移寄存器與密文無關了,僅與加密key和加密算法有關;

做法是不再把密文輸入到加密移位寄存器,而是把輸出的分組密文(Oi)輸入到壹位寄存器;

定義:

Enc(X,Y)是加密函數

Dec(X,Y)是解密函數

Key是加密密鑰;

Pi ( i = 0,1…n)是明文塊,大小為64bit;

Ci ( i = 0,1…n)是密文塊,大小為64bit;

Si ( i = 0,1…n),大小為8bit,n個連續的Si組成加密位移寄存器,壹般n=8;

Oi = Enc(Key, Si);

Lef(x) 為取數據x的最左8個bit位;

A(x,y)為合並x左移8位,空位用y填充

CFB加密算法可表示為:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Oi); 註意這裏與CFB模式的不同

CFB解密算法可表示為:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Oi);

特點:

與CFB類似,以下都是不同之處;

因為密文沒有參與鏈操作,所以使得OFB模式更容易受到攻擊;

不會進行錯誤傳播,某位密文發生錯誤,只會影響該位對應的明文,而不會影響別的位;

不是自同步的,如果加密和解密兩個操作失去同步,那麽系統需要重新初始化;

每次重新同步時,應使用不同的初始向量。可以避免產生相同的比特流,避免”已知明文”攻擊 ;

Windows API進行加密參數設置:

CryptGetKeyParam可以對HCRYPTKEY對象的各種參數進行查詢,包括加密模式、padding方式等;但這個函數不能用於查詢加密key的明文;

但如果需要看到真正加密的key是什麽,則需要另外的API:CryptExportKey,選擇PLAINTEXTKEYBLOB方式進行導出可以得到key的明文;

使用加密要註意的地方:

當兩個封裝好的加密算法對8byte數據進行DES加密時,如果加密出來的結果是壹樣的,千萬不要認為這兩個算法可以互換;

因為ECB模式,和向量全為0的CBC模式得到的密文前8byte,確實是壹樣,但後面的密文就不壹樣了;

使用加密以前確定妳理解了它;

互聯網程序中加密模式的使用:

ECB是不推薦的方式,Key相同時,相同的明文在不同的時候產生相同的明文,容易遭到字典攻擊;

CBC由於加入了向量參數,壹定程度上抵禦了字典工具,但缺點也隨之而來,壹旦中間壹個數據出錯或丟失,後面的數據將受到影響;

CFB與CBC類似,好處是明文和密文不用是8bit的整數倍,中間壹個數據出錯,只影響後面的幾個塊的數據;

OFB比CFB方式,壹旦壹個數據出錯,不會影響後面的數據,但安全性降低;

因此,推薦使用CFB方式,但每個數據包單獨加密,否則壹個數據包丟失,需要做很多容錯處理;

當然,具體問題也要具體分析,對於只需要”特定安全性”①,不需要”計算安全性”以上的軟件,也可以使用ECB模式;