互聯(lián)網(wǎng)的軟件設(shè)計(jì)一定少不了加密算法,并且大量使用的都會(huì)是對(duì)稱加密,比較常見(jiàn)的對(duì)稱加密有:DES、3DES、RC4、AES等等;
加密算法都有幾個(gè)共同的要點(diǎn):
- 密鑰長(zhǎng)度;(關(guān)系到密鑰的強(qiáng)度)
- 加密模式;(ecb、cbc等等)
- 塊加密算法里的填充方式區(qū)分;
對(duì)于加密模式,很多同學(xué)還不清楚,比如DES,也會(huì)有ECB、CBC等不同的區(qū)分,它們都是標(biāo)準(zhǔn)的;
Windows加密庫(kù)中,默認(rèn)則是CBC模式,也可以手工設(shè)置;
Openssl庫(kù)要更明顯一點(diǎn),它的函數(shù)名里面就寫明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式;
JAVA里面也比較清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式
各種加密模式有什么不同呢:(為了方便,這里的加密key都取64位)
電子密碼本模式ECB:
最古老,最簡(jiǎn)單的模式,將加密的數(shù)據(jù)分成若干組,每組的大小跟加密密鑰長(zhǎng)度相同;
然后每組都用相同的密鑰加密, 比如DES算法, 如果最后一個(gè)分組長(zhǎng)度不夠64位,要補(bǔ)齊64位;
定義:
Enc(X,Y)是加密函數(shù)
Dec(X,Y)是解密函數(shù)
Key是加密密鑰;
Pi ( i = 0,1…n)是明文塊,大小為64bit;
Ci ( i = 0,1…n)是密文塊,大小為64bit;
ECB加密算法可表示為:
Ci = Enc(Key, Pi)
ECB解密算法可以表示為:
Pi = Dec(Key,Ci)
算法 特點(diǎn):
- 每次Key、明文、密文的長(zhǎng)度都必須是64位;
- 數(shù)據(jù)塊重復(fù)排序不需要檢測(cè);
- 相同的明文塊(使用相同的密鑰)產(chǎn)生相同的密文塊,容易遭受字典攻擊;
- 一個(gè)錯(cuò)誤僅僅會(huì)對(duì)一個(gè)密文塊產(chǎn)生影響;
加密塊鏈模式CBC:
與ECB模式最大的不同是加入了初始向量
定義:
Enc(X,Y)是加密函數(shù)
Dec(X,Y)是解密函數(shù)
Key是加密密鑰;
Pi ( i = 0,1…n)是明文塊,大小為64bit;
Ci ( i = 0,1…n)是密文塊,大小為64bit;
XOR(X,Y)是異或運(yùn)算;
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))
算法特點(diǎn):
- 每次加密的密文長(zhǎng)度為64位(8個(gè)字節(jié));
- 當(dāng)相同的明文使用相同的密鑰和初始向量的時(shí)候CBC模式總是產(chǎn)生相同的密文;
- 密文塊要依賴以前的操作結(jié)果,所以,密文塊不能進(jìn)行重新排列;
- 可以使用不同的初始化向量來(lái)避免相同的明文產(chǎn)生相同的密文,一定程度上抵抗字典攻擊;
- 一個(gè)錯(cuò)誤發(fā)生以后,當(dāng)前和以后的密文都會(huì)被影響;
加密反饋模式CFB:
加密反饋模式克服了需要等待8個(gè)字節(jié)才能加密的缺點(diǎn),它采用了分組密碼作為流密碼的密鑰流生成器;
定義:
Enc(X,Y)是加密函數(shù)
Dec(X,Y)是解密函數(shù)
Key是加密密鑰;
Pi ( i = 0,1…n)是明文塊,大小為64bit;
Ci ( i = 0,1…n)是密文塊,大小為64bit;
Si ( i = 0,1…n),大小為8bit,n個(gè)連續(xù)的Si組成加密位移寄存器,一般n=8;
Oi = Enc(Key, Si);
Lef(x) 為取數(shù)據(jù)x的最左8個(gè)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);
圖示:
特點(diǎn):
- 每次加密的Pi和Ci不大于64位;
- 加密算法和解密算法相同,不能適用于公鑰算法;
- 使用相同的密鑰和初始向量的時(shí)候,相同明文使用CFB模式加密輸出相同的密文;
- 可以使用不同的初始化變量使相同的明文產(chǎn)生不同的密文,防止字典攻擊;
- 加密強(qiáng)度依賴于密鑰長(zhǎng)度;
- 加密塊長(zhǎng)度過(guò)小時(shí),會(huì)增加循環(huán)的數(shù)量,導(dǎo)致開(kāi)銷增加;
- 加密塊長(zhǎng)度應(yīng)時(shí)8位的整數(shù)倍(即字節(jié)為單位);
- 一旦某位數(shù)據(jù)出錯(cuò),會(huì)影響目前和其后8個(gè)塊的數(shù)據(jù);
輸出反饋模式OFB:
與CFB模式不同之處在于, 加密位移寄存器與密文無(wú)關(guān)了,僅與加密key和加密算法有關(guān);
做法是不再把密文輸入到加密移位寄存器,而是把輸出的分組密文(Oi)輸入到一位寄存器;
定義:
Enc(X,Y)是加密函數(shù)
Dec(X,Y)是解密函數(shù)
Key是加密密鑰;
Pi ( i = 0,1…n)是明文塊,大小為64bit;
Ci ( i = 0,1…n)是密文塊,大小為64bit;
Si ( i = 0,1…n),大小為8bit,n個(gè)連續(xù)的Si組成加密位移寄存器,一般n=8;
Oi = Enc(Key, Si);
Lef(x) 為取數(shù)據(jù)x的最左8個(gè)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);
特點(diǎn):
- 與CFB類似,以下都是不同之處;
- 因?yàn)槊芪臎](méi)有參與鏈操作,所以使得OFB模式更容易受到攻擊;
- 不會(huì)進(jìn)行錯(cuò)誤傳播,某位密文發(fā)生錯(cuò)誤,只會(huì)影響該位對(duì)應(yīng)的明文,而不會(huì)影響別的位;
- 不是自同步的,如果加密和解密兩個(gè)操作失去同步,那么系統(tǒng)需要重新初始化;
- 每次重新同步時(shí),應(yīng)使用不同的初始向量。可以避免產(chǎn)生相同的比特流,避免”已知明文”攻擊 ;
Windows API進(jìn)行加密參數(shù)設(shè)置:
CryptGetKeyParam可以對(duì)HCRYPTKEY對(duì)象的各種參數(shù)進(jìn)行查詢,包括加密模式、padding方式等;但這個(gè)函數(shù)不能用于查詢加密key的明文;
但如果需要看到真正加密的key是什么,則需要另外的API:CryptExportKey,選擇PLAINTEXTKEYBLOB方式進(jìn)行導(dǎo)出可以得到key的明文;
使用加密要注意的地方:
當(dāng)兩個(gè)封裝好的加密算法對(duì)8byte數(shù)據(jù)進(jìn)行DES加密時(shí),如果加密出來(lái)的結(jié)果是一樣的,千萬(wàn)不要認(rèn)為這兩個(gè)算法可以互換;
因?yàn)镋CB模式,和向量全為0的CBC模式得到的密文前8byte,確實(shí)是一樣,但后面的密文就不一樣了;
使用加密以前確定你理解了它;
互聯(lián)網(wǎng)程序中加密模式的使用:
ECB是不推薦的方式,Key相同時(shí),相同的明文在不同的時(shí)候產(chǎn)生相同的明文,容易遭到字典攻擊;
CBC由于加入了向量參數(shù),一定程度上抵御了字典工具,但缺點(diǎn)也隨之而來(lái),一旦中間一個(gè)數(shù)據(jù)出錯(cuò)或丟失,后面的數(shù)據(jù)將受到影響;
CFB與CBC類似,好處是明文和密文不用是8bit的整數(shù)倍,中間一個(gè)數(shù)據(jù)出錯(cuò),只影響后面的幾個(gè)塊的數(shù)據(jù);
OFB比CFB方式,一旦一個(gè)數(shù)據(jù)出錯(cuò),不會(huì)影響后面的數(shù)據(jù),但安全性降低;
因此,推薦使用CFB方式,但每個(gè)數(shù)據(jù)包單獨(dú)加密,否則一個(gè)數(shù)據(jù)包丟失,需要做很多容錯(cuò)處理;
當(dāng)然,具體問(wèn)題也要具體分析,對(duì)于只需要”特定安全性”①,不需要”計(jì)算安全性”以上的軟件,也可以使用ECB模式;