對稱加密演演算法

對稱加密演演算法

放棄詞條

修改後60秒內將自動保存草稿

預覽提交鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。

簡介


對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密演演算法。有時又叫傳統密碼演演算法,就是加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。而在大多數的對稱演演算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密演演算法為秘密密鑰演演算法或單密鑰演演算法。它要求發送方和接收方在安全通信之前,商定一個密鑰。對稱演演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。

特點


對稱加密演演算法的特點是演演算法公開、計算量小、加密速度快、加密效率高。
不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證。此外,每對用戶每次使用對稱加密演演算法時,都需要使用其他人不知道的惟一鑰匙,這會使得發收信雙方所擁有的鑰匙數量呈幾何級數增長,密鑰管理成為用戶的負擔。對稱加密演演算法在分散式網路系統上使用較為困難,主要是因為密鑰管理困難,使用成本較高。而與公開密鑰加密演演算法比起來,對稱加密演演算法能夠提供加密和認證卻缺乏了簽名功能,使得使用範圍有所縮小。在計算機專網系統中廣泛使用的對稱加密演演算法有DES和IDEA等。美國國家標準局倡導的AES即將作為新標準取代DES。

具體演演算法


DES演演算法,3DES演演算法,TDEA演演算法,Blowfish演演算法,RC5演演算法,IDEA演演算法。

原理應用


對稱加密演演算法的優點在於加解密的高速度和使用長密鑰時的難破解性。假設兩個用戶需要使用對稱加密方法加密然後交換數據,則用戶最少需要2個密鑰並交換使用,如果企業內用戶有n個,則整個企業共需要n×(n-1) 個密鑰,密鑰的生成和分發將成為企業信息部門的惡夢。對稱加密演演算法的安全性取決於加密密鑰的保存情況,但要求企業中每一個持有密鑰的人都保守秘密是不可能的,他們通常會有意無意的把密鑰泄漏出去——如果一個用戶使用的密鑰被入侵者所獲得,入侵者便可以讀取該用戶密鑰加密的所有文檔,如果整個企業共用一個加密密鑰,那整個企業文檔的保密性便無從談起。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 };
RijndaelManaged myRijndael = new RijndaelManaged();
FileStream fsOut = File.Open(strOutName, FileMode.Create,FileAccess.Write);//strOutName文件名及路徑 FileStream fsIn = File.Open(strPath, FileMode.Open,FileAccess.Read);
CryptoStream csDecrypt=new CryptoStream(fsOut,myRijndael.CreateEncryptor(key, IV),CryptoStreamMode.Write);//讀加密文本
BinaryReader br = new BinaryReader(fsIn);
csDecrypt.Write(br.ReadBytes((int)fsIn.Length),0, (int)fsIn.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 };
RijndaelManaged myRijndael = new RijndaelManaged();
FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read);
CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key,IV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(csDecrypt);//把文件讀出來
StreamWriter sw = new StreamWriter(strInName);//解密後文件寫入一個新的文件
sw.Write(sr.ReadToEnd());
sw.Flush();
sw.Close();
sr.Close();f
sOut.Close();
用圖片加密(RC2CryptoServiceProvider )
FileStreamfsPic = new FileStream(pictureBox1.ImageLocation,FileMode.Open, FileAccess.Read);
//加密文件流(textBox1.Text是文件名及路徑)
FileStream fsText = new FileStream(textBox1.Text, FileMode.Open,FileAccess.Read);
byte[] bykey = new byte[16]; //初始化
Key IVbyte[] byIv = new byte[8];
fsPic.Read(bykey, 0, 16);
fsPic.Read(byIv, 0, 8);
RC2CryptoServiceProvider desc = newRC2CryptoServiceProvider();//desc進行加密
BinaryReader br = new BinaryReader(fsText);//從要加密的文件中讀出文件內容
FileStream fsOut = File.Open(strLinPath,FileMode.Create, FileAccess.Write); // strLinPath臨時加密文件路徑CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey,byIv), CryptoStreamMode.Write);//寫入臨時加密文件
cs.Write(br.ReadBytes((int)fsText.Length),0, (int)fsText.Length);//寫入加密流
cs.FlushFinalBlock();
cs.Flush();
cs.Close();
fsPic.Close();
fsText.Close();
fsOut.Close();
用圖片解密
FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //圖片流FileStream fsOut = File.Open(textBox1.Text,FileMode.Open, FileAccess.Read);//解密文件流
byte[] bykey = new byte[16]; //初始化
Key IVbyte[] byIv = new byte[8];
fsPic.Read(bykey, 0, 16);
fsPic.Read(byIv, 0, 8);
string strPath = textBox1.Text;//加密文件的路徑
int intLent = strPath.LastIndexOf("\\")+ 1;
int intLong = strPath.Length;
string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名稱
string strLinPath = "C:\\"+ strName;//臨時解密文件路徑
FileStream fs = new FileStream(strLinPath, FileMode.Create,FileAccess.Write);
RC2CryptoServiceProvider desc = newRC2CryptoServiceProvider();//desc進行解密
CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey,byIv), CryptoStreamMode.Read);
//讀出加密文件
BinaryReader sr = new BinaryReader(csDecrypt);//從要加密流中讀出文件內容
BinaryWriter sw = new BinaryWriter(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);//複製加密文件
File.Delete(strLinPath);//刪除臨時文件

加密演演算法


基於“對稱密鑰”的加密演演算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等。
對稱密鑰:DES TripleDES演演算法
DES演演算法把64位的明文輸入塊變為數據長度為64位的密文輸出塊,其中8位為奇偶校驗位,另外56位作為密碼的長度。首先,DES把輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位,並進行前後置換,最終由L0輸出左32位,R0輸出右32位,根據這個法則經過16次迭代運算后,得到L16、R16,將此作為輸入,進行與初始置換相反的逆置換,即得到密文輸出。
DES演演算法具有極高的安全性,到目前為止,除了用窮舉搜索法對DES演演算法進行攻擊外,還沒有發現更有效的辦法,而56位長密鑰的窮舉空間為2^56,這意味著如果一台計算機的速度是每秒種檢測100萬個密鑰,那麼它搜索完全部密鑰就需要將近2285年的時間,因此DES演演算法是一種很可靠的加密方法。
對稱密鑰:RC演演算法
RC4演演算法的原理是“攪亂”,它包括初始化演演算法和偽隨機子密碼生成演演算法兩大部分,在初始化的過程中,密鑰的主要功能是將一個256位元組的初始數簇進行隨機攪亂,不同的數簇在經過偽隨機子密碼生成演演算法的處理后可以得到不同的子密鑰序列,將得到的子密鑰序列和明文進行異或運算(XOR)后,得到密文。
由於RC4演演算法加密採用的是異或方式,所以,一旦子密鑰序列出現了重複,密文就有可能被破解,但是目前還沒有發現密鑰長度達到128位的RC4有重複的可能性,所以,RC4也是目前最安全的加密演演算法之一。
對稱密鑰:BlowFish演演算法
BlowFish演演算法是一個64位分組及可變密鑰長度的分組密碼演演算法,該演演算法是非專利的。
BlowFish演演算法使用兩個“盒”:pbox[18]和sbox[4256],BlowFish演演算法有一個核心加密函數。該函數輸入64位信息,運算后以64位密文的形式輸出。用BlowFish演演算法加密信息,需要密鑰預處理和信息加密兩個過程。BlowFish演演算法的原密鑰pbox和sbox是固定的,要加密一個信息,需要選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所用到的key_pbox和key_sbox。
BlowFish演演算法解密,同樣也需要密鑰預處理和信息解密兩個過程。密鑰預處理的過程和加密時完全相同。信息解密的過程就是把信息加密過程的key_pbox逆序使用即可。

應用模式


加密模式(英文名稱及簡寫)中文名稱
Electronic Code Book(ECB)電子密碼本模式
Cipher Block Chaining(CBC)密碼分組鏈接模式
Cipher Feedback Mode(CFB)加密反饋模式
Output Feedback Mode(OFB)輸出反饋模式
ECB:最基本的加密模式,也就是通常理解的加密,相同的明文將永遠加密成相同的密文,無初始向量,容易受到密碼本重放攻擊,一般情況下很少用。
CBC:明文被加密前要與前面的密文進行異或運算后再加密,因此只要選擇不同的初始向量,相同的密文加密後會形成不同的密文,這是目前應用最廣泛的模式。CBC加密后的密文是上下文相關的,但明文的錯誤不會傳遞到後續分組,但如果一個分組丟失,後面的分組將全部作廢(同步錯誤)。
CFB:類似於自同步序列密碼,分組加密后,按8位分組將密文和明文進行移位異或后得到輸出同時反饋回移位寄存器,優點最小可以按位元組進行加解密,也可以是n位的,CFB也是上下文相關的,CFB模式下,明文的一個錯誤會影響後面的密文(錯誤擴散)。
OFB:將分組密碼作為同步序列密碼運行,和CFB相似,不過OFB用的是前一個n位密文輸出分組反饋回移位寄存器,OFB沒有錯誤擴散問題。