轉帖|使用教程|編輯:楊鵬連|2021-06-01 17:32:48.993|閱讀 471 次
概述:說到軟件安全保護,數(shù)據(jù)加密技術是網絡中最基本的安全技術,小編為大家介紹了常用數(shù)據(jù)加密和解密方法匯總,以及給出相關實現(xiàn)代碼。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
上圖是整個DES和TripleDES算法的加密解密過程,下面以TripleDES為例,結合dotnet分析加密解密的各個步驟,并給出相關實現(xiàn)代碼。
1、 生成key和IV
System.Security.Cryptography. TripleDESCryptoServiceProvider類是dotnet中實現(xiàn)TripleDES算法的主要的類。
TripleDESCryptoServiceProvider類只有一個構造方法TripleDESCryptoServiceProvider(),這個方法把一些屬性初始化:
KeySize(加密密鑰長度,以位為單位)= 192(24字節(jié))
BlockSize(加密處理的數(shù)據(jù)塊大小,以位為單位)= 64(8字節(jié))
FeedbackSize(加密數(shù)據(jù)塊后返回的數(shù)據(jù)大小,以位為單位)= 64(8字節(jié))
TripleDESCryptoServiceProvider構造方法同時會初始化一組隨機的key和IV。
默認的TripleDESCryptoServiceProvider的key為24字節(jié),IV為8字節(jié),加密數(shù)據(jù)塊為8字節(jié)。
生成key和IV的代碼很簡單:
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
byte[] keyArray = tDESalg.Key;
byte[] IVArray = tDESalg.IV;
生成的key和IV在加密過程和解密過程都要使用。
2、 字符串明文轉成某一代碼頁對應的編碼字節(jié)流
待加密的數(shù)據(jù)可能有兩種形式,一種是二進制的數(shù)據(jù),本身就是一組字節(jié)流,這樣的數(shù)據(jù)可以跳過這一步,直接進入加密步驟。還有一種情況是字符串數(shù)據(jù),字符串中同樣的字符使用不同的代碼頁會生成不同的字節(jié)碼,所以從字符串到字節(jié)流的轉換是需要指定使用何種編碼的。在解密之后,要從字節(jié)流轉換到字符串就要使用相同的代碼頁解碼,否則就會出現(xiàn)亂碼。
// 待加密的字符串
string plainTextString = "Here is some data to encrypt. 這里是一些要加密的數(shù)據(jù)。";
// 使用utf-8編碼(也可以使用其它的編碼)
Encoding sEncoding = Encoding.GetEncoding("utf-8");
// 把字符串明文轉換成utf-8編碼的字節(jié)流
byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
3、 加密操作
加密的原料是明文字節(jié)流,TripleDES算法對字節(jié)流進行加密,返回的是加密后的字節(jié)流。同時要給定加密使用的key和IV。
// 把字符串明文轉換成utf-8編碼的字節(jié)流
byte[] plainTextArray = sEncoding.GetBytes(plainTextString); public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這里面存放加密后的數(shù)據(jù)流 MemoryStream mStream = new MemoryStream(); // 使用MemoryStream 和key、IV新建一個CryptoStream 對象 CryptoStream cStream = new CryptoStream(mStream, new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write); // 將加密后的字節(jié)流寫入到MemoryStream cStream.Write(plainTextArray, 0, plainTextArray.Length); //把緩沖區(qū)中的最后狀態(tài)更新到MemoryStream,并清除cStream的緩存區(qū) cStream.FlushFinalBlock(); // 把解密后的數(shù)據(jù)流轉成字節(jié)流 byte[] ret = mStream.ToArray(); // 關閉兩個streams. cStream.Close(); mStream.Close(); return ret; }4、 解密操作
解密操作解密上面步驟生成的密文byte[],需要使用到加密步驟使用的同一組Key和IV。
// 調用解密方法,返回已解密數(shù)據(jù)的byte[]
byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray); public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這里面存放加密后的數(shù)據(jù)流 MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray); // 使用MemoryStream 和key、IV新建一個CryptoStream 對象 CryptoStream csDecrypt = new CryptoStream(msDecrypt, new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read); // 根據(jù)密文byte[]的長度(可能比加密前的明文長),新建一個存放解密后明文的byte[] byte[] DecryptDataArray = new byte[EncryptedDataArray.Length]; // 把解密后的數(shù)據(jù)讀入到DecryptDataArray csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length); msDecrypt.Close(); csDecrypt.Close(); return DecryptDataArray; }有一點需要注意,DES加密是以數(shù)據(jù)塊為單位加密的,8個字節(jié)一個數(shù)據(jù)塊,如果待加密明byte[]的長度不是8字節(jié)的整數(shù)倍,算法先用值為“0”的byte補足8個字節(jié),然后進行加密。所以加密后的密文長度一定是8的整數(shù)倍。這樣的密文解密后如果補了0值的byte,則解密后這些0值的byte依然存在。比如上例中要加密的明文是:
“Here is some data to encrypt. 這里是一些要加密的數(shù)據(jù)。”
轉成明文byte[]后是66個字節(jié),DES算法就會補上6個0值的byte,補到72個字節(jié)。這樣加密后再解密回來的密文byte[]解碼后的字符串就是這樣的:
"Here is some data to encrypt. 這里是一些要加密的數(shù)據(jù)。\0\0\0\0\0\0"
5、 從編碼字節(jié)流轉成字符串明文
// 使用前面定義的Encoding,utf-8的編碼把byte[]轉成字符串
plainTextString = sEncoding.GetString(finalPlainTextArray);
說到軟件安全保護,小編為大家推薦幾款給力的加密解密軟件保護工具,希望對您有所幫助。
網絡評價:加密的安全級別非常高,破解難度很大,但是加密數(shù)據(jù)多,需要注意系統(tǒng)的性能。
網絡評價:用好其虛擬機保護功能,將關鍵敏感代碼用虛擬機保護起來,能很好提高強度。
網絡評價:WinLicense主要比Themida多了一個協(xié)議,可以設定使用時間,運行次數(shù)等功能,兩者核心保護是一樣的。
慧都科技響應“全面加強知識產權保護,推動構建新發(fā)展格局”號召,加密解密產品為您的應用程序保駕護航!在線購買享受限時特惠,Go!>>
★VMProtect
【下載試用】
【在線購買】
★Themida
【下載試用】
【在線購買】
★WinLicense
【下載試用】
【在線購買】
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: