資料加密技術是網路中最基本的安全技術,主要是通過對網路中傳輸的資訊進行資料加密來保障其安全性,這是一種主動安全防禦策略,用很小的代價即可為資訊提供相當大的安全保護。
資料加密技術是網路中最基本的安全技術,主要是通過對網路中傳輸的資訊進行資料加密來保障其安全性,這是一種主動安全防禦策略,用很小的代價即可為資訊提供相當大的安全保護。
一、加密的基本概念
"加密",是一種限制對網路上傳輸資料的訪問權的技術。未經處理資料(也稱為明文,plaintext)被加密裝置(硬體或軟體)和祕密金鑰加密而產生的經過編碼的資料稱為密文(ciphertext)。將密文還原為原始明文的過程稱為解密,它是加密的反向處理,但解密者必須利用相同類型的加密裝置和金鑰組密文進行解密。
加密的準系統包括:
1. 防止不速之客查看機密的資料檔案;
2. 防止機密資料被泄露或篡改;
3. 防止特權使用者(如系統管理員)查看私人資料檔案;
4. 使入侵者不能輕易地尋找一個系統的檔案。
資料加密是確保電腦網路安全的一種重要機制,雖然由於成本、技術和管理上的複雜性等原因,目前尚未在網路中普及,但資料加密的確是實現分布式系統和網路環境下資料安全的重要手段之一。
資料加密可在網路OSI七層協議(OSI是Open System Interconnect的縮寫,意為開放式系統互聯。國際標準組織(國際標準組織)制定了OSI模型。這個模型把網路通訊的工作分為7層,分別是物理層、資料連結層、網路層、傳輸層、會話層、展示層和應用程式層。)的多層上實現、所以從加密技術應用的邏輯位置看,有三種方式:
①鏈路加密:通常把網路層以下的加密叫鏈路加密,主要用於保護通訊節點間傳輸的資料,加解密由置於線路上的密碼裝置實現。根據傳遞的資料的同步方式又可分為同步通訊加密和非同步通訊加密兩種,同步通訊加密又包含位元組同步通訊加密和位同步通訊加密。
②節點加密:是對鏈路加密的改進。在協議傳輸層上進行加密,主要是對源節點和目標節點之間傳輸資料進行加密保護,與鏈路加密類似.只是密碼編譯演算法要結合在依附於節點的加密模件中,克服了鏈路加密在節點處易遭非法存取的缺點。
③端對端加密:網路層以上的加密稱為端對端加密。是面向網路層主體。對應用程式層的資料資訊進行加密,易於用軟體實現,且成本低,但密鑰管理問題困難,主要適合大型網路系統中資訊在多個發方和收方之間傳輸的情況。
二、資料加密的應用
1、 媒體加密:DRM
2、 檔案加密:文本加密、pdf、word
3、 資料加密:ASP.NET(C#)中的資料加密
4、 硬體加密:加密狗
三.加密技術發展趨勢
①私用祕密金鑰加密技術與公開祕密金鑰加密技術相結合:鑒於兩種密碼體制加密的特點,在實際應用中可以採用折衷方案,即結合使用DES/IDEA和RSA,以DES為"核心",RSA為"外殼",對於網路中傳輸的資料可用DES或IDEA加密,而加密用的密鑰則用RSA加密傳送,此種方法既保證了資料安全又提高了加密和解密的速度,這也是目前加密技術發展的新方向之一。
②尋求新演算法:跳出以常見的迭代為基礎的構造思路,脫離基於某些數學問題複雜性的構造方法。如劉尊全先生提出的劉氏演算法,是一種基於密鑰的公開密鑰體制,它採用了隨機性原理構造加解密變換,並將其全部運算控制隱匿於密鑰中,密鑰長度可變。它是採用選取一定長度的分割來構造大的搜尋空間,從而實現一次非線性變換。此種密碼編譯演算法加密強度高、速度快、計算開銷低。
③加密最終將被整合到系統和網路中,例如IPV6協議就已有了內建加密的支援,在硬體方面,Intel公司正研製一種加密副處理器。它可以整合到微機的主極上。
四、加密技術的分類
加密類型可以簡單地分為四種:
1. 根本不考慮解密問題;
2. 私用祕密金鑰加密技術:對稱式加密(Symmetric Key Encryption):對稱式加密方式對加密和解密使用相同的密鑰。通常,這種加密方式在應用中難以實施,因為用同一種安全方式共用密鑰很難。如:RC4、RC2、DES 和 AES 系列密碼編譯演算法。
3. 公開祕密金鑰加密技術:非對稱金鑰密碼編譯(Asymmetric Key Encryption):非對稱金鑰密碼編譯使用一組公用/私人密鑰系統,加密時使用一種密鑰,解密時使用另一種密鑰。公用密鑰可以廣泛的共用和透露。當需要用加密方式向伺服器外部傳送資料時,這種加密方式更方便。如: RSA
4. 數位憑證。(Certificate):數位憑證是一種非對稱金鑰密碼編譯,但是,一個組織可以使用認證並通過數位簽章將一組公開金鑰和私密金鑰與其擁有者相關聯。
五、對稱式加密之DES加密與解密
一、 對稱式加密
對稱式加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的密鑰,資訊的寄件者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通訊雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。
單鑰密碼系統的安全性依賴於以下兩個因素:
第一、密碼編譯演算法必須是足夠強的,僅僅基於密文本身去解密資訊在實踐上是不可能的。
第二、加密方法的安全性依賴於密鑰的秘密性,而不是演算法的秘密性,因此,我們沒有必要確保演算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的演算法都是公開的),但是我們一定要保證密鑰的秘密性。
DES(Data Encryption Standard)和TripleDES是對稱式加密的兩種實現。
DES和TripleDES基本演算法一致,只是TripleDES演算法提供的key位元更多,加密可靠性更高。
DES使用的密鑰key為8位元組,初始向量IV也是8位元組。
TripleDES使用24位元組的key,初始向量IV也是8位元組。
兩種演算法都是以8位元組為一個塊進行加密,一個資料區塊一個資料區塊的加密,一個8位元組的明文加密後的密文也是8位元組。如果明文長度不為8位元組的整數倍,添加值為0的位元組湊滿8位元組整數倍。所以加密後的密文長度一定為8位元組的整數倍。
二、 加密解密過程
Figure 1. DES加密解密過程
是整個DES和TripleDES演算法的加密解密過程,下面以TripleDES為例,結合dotnet分析加密解密的各個步驟,並給出相關實現代碼。
1、 產生key和IV
System.Security.Cryptography. TripleDESCryptoServiceProvider類是dotnet中實現TripleDES演算法的主要的類。
TripleDESCryptoServiceProvider類只有一個構造方法TripleDESCryptoServiceProvider(),這個方法把一些屬性初始化:
KeySize(加密金鑰長度,以位為單位)= 192(24位元組)
BlockSize(加密處理的資料區塊大小,以位為單位)= 64(8位元組)
FeedbackSize(加密資料塊後返回的資料大小,以位為單位)= 64(8位元組)
TripleDESCryptoServiceProvider構造方法同時會初始化一組隨機的key和IV。
預設的TripleDESCryptoServiceProvider的key為24位元組,IV為8位元組,加密資料塊為8位元組。
產生key和IV的代碼很簡單:
以下是程式碼片段: TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); byte[] keyArray = tDESalg.Key; byte[] IVArray = tDESalg.IV; |
產生的key和IV在加密過程和解密過程都要使用。
2、 字串明文轉成某一字碼頁對應的編碼位元組流
待加密的資料可能有兩種形式,一種是二進位的資料,本身就是一組位元組流,這樣的資料可以跳過這一步,直接進入加密步驟。還有一種情況是字串資料,字串中同樣的字元使用不同的字碼頁會產生不同的位元組碼,所以從字串到位元組流的轉換是需要指定使用何種編碼的。在解密之後,要從位元組流轉換到字串就要使用相同的字碼頁解碼,否則就會出現亂碼。
以下是程式碼片段: // 待加密的字串 string plainTextString = "Here is some data to encrypt. 這裡是一些要加密的資料。"; // 使用utf-8編碼(也可以使用其它的編碼) Encoding sEncoding = Encoding.GetEncoding("utf-8"); // 把字串明文轉換成utf-8編碼的位元組流 byte[] plainTextArray = sEncoding.GetBytes(plainTextString); |
3、 加密操作
加密的原料是明文位元組流,TripleDES演算法對位元組流進行加密,返回的是加密後的位元組流。同時要給定加密使用的key和IV。
以下是程式碼片段: // 把字串明文轉換成utf-8編碼的位元組流 byte[] plainTextArray = sEncoding.GetBytes(plainTextString); public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這裡面存放加密後的資料流 MemoryStream mStream = new MemoryStream(); // 使用MemoryStream 和key、IV建立一個CryptoStream 對象 CryptoStream cStream = new CryptoStream(mStream, new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write); // 將加密後的位元組流寫入到MemoryStream cStream.Write(plainTextArray, 0, plainTextArray.Length); //把緩衝區中的最後狀態更新到MemoryStream,並清除cStream的緩衝區 cStream.FlushFinalBlock(); // 把解密後的資料流轉成位元組流 byte[] ret = mStream.ToArray(); // 關閉兩個streams. cStream.Close(); mStream.Close(); return ret; } |
4、 解密操作
解密操作解密上面步驟產生的密文byte[],需要使用到加密步驟使用的同一組Key和IV。
以下是程式碼片段: // 調用解密方法,返回已解密資料的byte[] byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray); public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這裡面存放加密後的資料流 MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray); // 使用MemoryStream 和key、IV建立一個CryptoStream 對象 CryptoStream csDecrypt = new CryptoStream(msDecrypt, new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read); // 根據密文byte[]的長度(可能比加密前的明文長),建立一個存放解密後明文的byte[] byte[] DecryptDataArray = new byte[EncryptedDataArray.Length]; // 把解密後的資料讀入到DecryptDataArray csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length); msDecrypt.Close(); csDecrypt.Close(); return DecryptDataArray; } |
有一點需要注意,DES加密是以資料區塊為單位加密的,8個位元組一個資料區塊,如果待加密明byte[]的長度不是8位元組的整數倍,演算法先用值為“0”的byte補足8個位元組,然後進行加密。所以加密後的密文長度一定是8的整數倍。這樣的密文解密後如果補了0值的byte,則解密後這些0值的byte依然存在。比如上例中要加密的明文是:
“Here is some data to encrypt. 這裡是一些要加密的資料。”
轉成明文byte[]後是66個位元組,DES演算法就會補上6個0值的byte,補到72個位元組。這樣加密後再解密回來的密文byte[]解碼後的字串就是這樣的:
以下是程式碼片段: "Here is some data to encrypt. 這裡是一些要加密的資料。\0\0\0\0\0\0" 5、 從編碼位元組流轉成字串明文 // 使用前面定義的Encoding,utf-8的編碼把byte[]轉成字串 plainTextString = sEncoding.GetString(finalPlainTextArray); |
未完,下接:http://www.cnblogs.com/wifi/archive/2011/11/16/2250760.html