對(duì)稱加密算法 - 處理明文和加密密鑰
對(duì)稱加密算法是應(yīng)用較早的加密算法,技術(shù)成熟。在對(duì)稱加密算法中,數(shù)據(jù)發(fā)信方將明文(原始數(shù)據(jù))和加密密鑰(miyue)一起經(jīng)過特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去。收信方收到密文后,若想解讀原文,則需要使用加密用過的密鑰及相同算法的逆算法對(duì)密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。在對(duì)稱加密算法中,使用的密鑰只有一個(gè),發(fā)收信雙方都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密,這就要求解密方事先必須知道加密密鑰。對(duì)稱加密算法的特點(diǎn)是算法公開、計(jì)算量小、加密速度快、加密效率高。

簡(jiǎn)介
對(duì)稱加密 - 也叫私鑰加密指加密和解密使用相同密鑰的加密算法。有時(shí)又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,同時(shí)解密密鑰也可以從加密密鑰中推算出來。而在大多數(shù)的對(duì)稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法為秘密密鑰算法或單密鑰算法。它要求發(fā)送方和接收方在安全通信之前,商定一個(gè)密鑰。對(duì)稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都可以對(duì)他們發(fā)送或接收的消息解密,所以密鑰的保密性對(duì)通信的安全性至關(guān)重要。
特點(diǎn)
對(duì)稱加密算法的特點(diǎn)是算法公開、計(jì)算量小、加密速度快、加密效率高。
不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證。此外,每對(duì)用戶每次使用對(duì)稱加密算法時(shí),都需要使用其他人不知道的惟一鑰匙,這會(huì)使得發(fā)收信雙方所擁有的鑰匙數(shù)量呈幾何級(jí)數(shù)增長(zhǎng),密鑰管理成為用戶的負(fù)擔(dān)。對(duì)稱加密算法在分布式網(wǎng)絡(luò)系統(tǒng)上使用較為困難,主要是因?yàn)槊荑€管理困難,使用成本較高。而與公開密鑰加密算法比起來,對(duì)稱加密算法能夠提供加密和認(rèn)證卻缺乏了簽名功能,使得使用范圍有所縮小。在計(jì)算機(jī)專網(wǎng)系統(tǒng)中廣泛使用的對(duì)稱加密算法有DES和IDEA等。美國(guó)國(guó)家標(biāo)準(zhǔn)局倡導(dǎo)的AES即將作為新標(biāo)準(zhǔn)取代DES。
具體算法
DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。
原理應(yīng)用
對(duì)稱加密算法的優(yōu)點(diǎn)在于加解密的高速度和使用長(zhǎng)密鑰時(shí)的難破解性。假設(shè)兩個(gè)用戶需要使用對(duì)稱加密方法加密然后交換數(shù)據(jù),則用戶最少需要2個(gè)密鑰并交換使用,如果企業(yè)內(nèi)用戶有n個(gè),則整個(gè)企業(yè)共需要n× - n-1個(gè)密鑰,密鑰的生成和分發(fā)將成為企業(yè)信息部門的惡夢(mèng)。對(duì)稱加密算法的安全性取決于加密密鑰的保存情況,但要求企業(yè)中每一個(gè)持有密鑰的人都保守秘密是不可能的,他們通常會(huì)有意無意的把密鑰泄漏出去——如果一個(gè)用戶使用的密鑰被入侵者所獲得,入侵者便可以讀取該用戶密鑰加密的所有文檔,如果整個(gè)企業(yè)共用一個(gè)加密密鑰,那整個(gè)企業(yè)文檔的保密性便無從談起。
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
TripleDESCryptoServiceProvider
//例加密文本文件 - RijndaelManaged
byte[]key={24,55,102,24,98,26,67,29,84,19,37,118,104,85,121,27,93,86,24,55,102,24,98,26,67,29,9,2,49,69,73,92};
byte[]IV={22,56,82,77,84,31,74,24,55,102,24,98,26,67,29,99};
RijndaelManagedmyRijndael=newRijndaelManaged - ;
FileStreamfsOut=File.Open - strOutName,FileMode.Create,FileAccess.Write;//strOutName文件名及路徑FileStreamfsIn=File.Open - strPath,FileMode.Open,FileAccess.Read;
CryptoStreamcsDecrypt=newCryptoStream - fsOut,myRijndael.CreateEncryptor - key,IV,CryptoStreamMode.Write;//讀加密文本
BinaryReaderbr=newBinaryReader - fsIn;
csDecrypt.Write - br.ReadBytes - - intfsIn.Length,0, - intfsIn.Length;
csDecrypt.FlushFinalBlock - ;
csDecrypt.Close - ;
fsIn.Close - ;
fsOut.Close - ;
//解密文件
byte[]key={24,55,102,24,98,26,67,29,84,19,37,118,104,85,121,27,93,86,24,55,102,24,98,26,67,29,9,2,49,69,73,92};
byte[]IV={22,56,82,77,84,31,74,24,55,102,24,98,26,67,29,99};
RijndaelManagedmyRijndael=newRijndaelManaged - ;
FileStreamfsOut=File.Open - strPath,FileMode.Open,FileAccess.Read;
CryptoStreamcsDecrypt=newCryptoStream - fsOut,myRijndael.CreateDecryptor - key,IV,CryptoStreamMode.Read;
StreamReadersr=newStreamReader - csDecrypt;//把文件讀出來
StreamWritersw=newStreamWriter - strInName;//解密后文件寫入一個(gè)新的文件
sw.Write - sr.ReadToEnd - ;
sw.Flush - ;
sw.Close - ;
sr.Close - ;f
sOut.Close - ;
用圖片加密 - RC2CryptoServiceProvider
FileStreamfsPic=newFileStream - pictureBox1.ImageLocation,FileMode.Open,FileAccess.Read;
//加密文件流(textBox1.Text是文件名及路徑)
FileStreamfsText=newFileStream - textBox1.Text,FileMode.Open,FileAccess.Read;
byte[]bykey=newbyte;//初始化
KeyIVbyte[]byIv=newbyte;
fsPic.Read - bykey,0,16;
fsPic.Read - byIv,0,8;
RC2CryptoServiceProviderdesc=newRC2CryptoServiceProvider - ;//desc進(jìn)行加密
BinaryReaderbr=newBinaryReader - fsText;//從要加密的文件中讀出文件內(nèi)容
FileStreamfsOut=File.Open - strLinPath,FileMode.Create,FileAccess.Write;//strLinPath臨時(shí)加密文件路徑CryptoStreamcs=newCryptoStream - fsOut,desc.CreateEncryptor - bykey,byIv,CryptoStreamMode.Write;//寫入臨時(shí)加密文件
cs.Write - br.ReadBytes - - intfsText.Length,0, - intfsText.Length;//寫入加密流
cs.FlushFinalBlock - ;
cs.Flush - ;
cs.Close - ;
fsPic.Close - ;
fsText.Close - ;
fsOut.Close - ;
用圖片解密
FileStreamfsPic=newFileStream - pictureBox1.ImageLocation,FileMode.Open,FileAccess.Read;//圖片流FileStreamfsOut=File.Open - textBox1.Text,FileMode.Open,FileAccess.Read;//解密文件流
byte[]bykey=newbyte;//初始化
KeyIVbyte[]byIv=newbyte;
fsPic.Read - bykey,0,16;
fsPic.Read - byIv,0,8;
stringstrPath=textBox1.Text;//加密文件的路徑
intintLent=strPath.LastIndexOf - "////"+1;
intintLong=strPath.Length;
stringstrName=strPath.Substring - intLent,intLong-intLent;//要加密的文件名稱
stringstrLinPath="C:////"+strName;//臨時(shí)解密文件路徑
FileStreamfs=newFileStream - strLinPath,FileMode.Create,FileAccess.Write;
RC2CryptoServiceProviderdesc=newRC2CryptoServiceProvider - ;//desc進(jìn)行解密
CryptoStreamcsDecrypt=newCryptoStream - fsOut,desc.CreateDecryptor - bykey,byIv,CryptoStreamMode.Read;
//讀出加密文件
BinaryReadersr=newBinaryReader - csDecrypt;//從要加密流中讀出文件內(nèi)容
BinaryWritersw=newBinaryWriter - fs;//寫入解密流
sw.Write - sr.ReadBytes - Convert.ToInt32 - fsOut.Length;
//sw.Flush - ;
sw.Close - ;
sr.Close - ;
fs.Close - ;
fsOut.Close - ;
fsPic.Close - ;
csDecrypt.Flush - ;
File.Delete - textBox1.Text.TrimEnd - ;//刪除原文件
File.Copy - strLinPath,textBox1.Text;//復(fù)制加密文件
File.Delete - strLinPath;//刪除臨時(shí)文件
加密算法
基于“對(duì)稱密鑰”的加密算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等。
對(duì)稱密鑰:DESTripleDES算法
DES算法把64位的明文輸入塊變?yōu)閿?shù)據(jù)長(zhǎng)度為64位的密文輸出塊,其中8位為奇偶校驗(yàn)位,另外56位作為密碼的長(zhǎng)度。首先,DES把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L(zhǎng)0、R0兩部分,每部分各長(zhǎng)32位,并進(jìn)行前后置換,最終由L0輸出左32位,R0輸出右32位,根據(jù)這個(gè)法則經(jīng)過16次迭代運(yùn)算后,得到L16、R16,將此作為輸入,進(jìn)行與初始置換相反的逆置換,即得到密文輸出。
DES算法具有極高的安全性,到目前為止,除了用窮舉搜索法對(duì)DES算法進(jìn)行攻擊外,還沒有發(fā)現(xiàn)更有效的辦法,而56位長(zhǎng)密鑰的窮舉空間為256,這意味著如果一臺(tái)計(jì)算機(jī)的速度是每秒種檢測(cè)100萬(wàn)個(gè)密鑰,那么它搜索完全部密鑰就需要將近2285年的時(shí)間,因此DES算法是一種很可靠的加密方法。數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場(chǎng)合。
對(duì)稱密鑰:RC算法
RC4算法的原理是“攪亂”,它包括初始化算法和偽隨機(jī)子密碼生成算法兩大部分,在初始化的過程中,密鑰的主要功能是將一個(gè)256字節(jié)的初始數(shù)簇進(jìn)行隨機(jī)攪亂,不同的數(shù)簇在經(jīng)過偽隨機(jī)子密碼生成算法的處理后可以得到不同的子密鑰序列,將得到的子密鑰序列和明文進(jìn)行異或運(yùn)算(XOR)后,得到密文。
由于RC4算法加密采用的是異或方式,所以,一旦子密鑰序列出現(xiàn)了重復(fù),密文就有可能被破解,但是目前還沒有發(fā)現(xiàn)密鑰長(zhǎng)度達(dá)到128位的RC4有重復(fù)的可能性,所以,RC4也是目前最安全的加密算法之一。
應(yīng)用模式
|
加密模式 - 英文名稱及簡(jiǎn)寫 |
中文名稱 |
|
ElectronicCodeBook - ECB |
電子密碼本模式 |
|
CipherBlockChaining - CBC |
密碼分組鏈接模式 |
|
CipherFeedbackMode - CFB |
加密反饋模式 |
|
OutputFeedbackMode - OFB |
輸出反饋模式 |
ECB:最基本的加密模式,也就是通常理解的加密,相同的明文將永遠(yuǎn)加密成相同的密文,無初始向量,容易受到密碼本重放攻擊,一般情況下很少用。
CBC:明文被加密前要與前面的密文進(jìn)行異或運(yùn)算后再加密,因此只要選擇不同的初始向量,相同的密文加密后會(huì)形成不同的密文,這是目前應(yīng)用最廣泛的模式。CBC加密后的密文是上下文相關(guān)的,但明文的錯(cuò)誤不會(huì)傳遞到后續(xù)分組,但如果一個(gè)分組丟失,后面的分組將全部作廢 - 同步錯(cuò)誤。
CFB:類似于自同步序列密碼,分組加密后,按8位分組將密文和明文進(jìn)行移位異或后得到輸出同時(shí)反饋回移位寄存器,優(yōu)點(diǎn)最小可以按字節(jié)進(jìn)行加解密,也可以是n位的,CFB也是上下文相關(guān)的,CFB模式下,明文的一個(gè)錯(cuò)誤會(huì)影響后面的密文 - 錯(cuò)誤擴(kuò)散。
OFB:將分組密碼作為同步序列密碼運(yùn)行,和CFB相似,不過OFB用的是前一個(gè)n位密文輸出分組反饋回移位寄存器,OFB沒有錯(cuò)誤擴(kuò)散問題。
