轉帖|使用教程|編輯:楊鵬連|2021-06-01 17:32:48.993|閱讀 471 次
概述:說到軟件安全保護,數據加密技術是網絡中最基本的安全技術,小編為大家介紹了常用數據加密和解密方法匯總,以及給出相關實現代碼。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
上圖是整個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);
說到軟件安全保護,小編為大家推薦幾款給力的加密解密軟件保護工具,希望對您有所幫助。
網絡評價:加密的安全級別非常高,破解難度很大,但是加密數據多,需要注意系統的性能。
網絡評價:用好其虛擬機保護功能,將關鍵敏感代碼用虛擬機保護起來,能很好提高強度。
網絡評價:WinLicense主要比Themida多了一個協議,可以設定使用時間,運行次數等功能,兩者核心保護是一樣的。
慧都科技響應“全面加強知識產權保護,推動構建新發展格局”號召,加密解密產品為您的應用程序保駕護航!在線購買享受限時特惠,Go!>>
★VMProtect
【下載試用】
【在線購買】
★Themida
【下載試用】
【在線購買】
★WinLicense
【下載試用】
【在線購買】
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: