google-code-prettify

星期一, 8月 12, 2019

【C#】3DES 加解密

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看似卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛.爛..爛...)
Music:
#表升半音 []表高八度
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 5 4 3 4 2 6 4 5 [2] [1] #6 6 5 6
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 4 3 2 4 2 6 4 5 [2] #6 6 5 6
口白:
刻爛:真実はいつも一つ!

環境:
https://rextester.com/ online

狀況:
該死的資安,這世界有什麼資料是重要的…
為了符合萬惡的資安!研究了C# 3DES的方法

要如何實做?問問谷哥吧…沒有谷哥罩…我就廢了…

問題:
什麼是 3DES 維基百科,自由的百科全書 定義如下:
密碼學中,三重資料加密演算法(英語:Triple Data Encryption Algorithm,縮寫為TDEA,Triple DEA),或稱3DES(Triple DES),是一種對稱密鑰加密塊密碼,相當於是對每個資料塊應用三次資料加密標準(DES)演算法。由於電腦運算能力的增強,原版DES密碼的金鑰長度變得容易被暴力破解;3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的金鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。
對看透真相的卜朧共來說,這一點都不重要!

重要的是可以線上寫程式測試…是多美好的事…
在一次無意間發現了rextester.com 這個網站…
它可以線上編輯程式並執行,
對於從開始寫asp程式就用記事本寫的卜朧共來說,簡直是天堂般的存在…
這樣寫一些測試用的小程式,超便利的…

問谷哥找了一些文獻,寫了一段來測試…

程式碼如下:
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.IO;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //string DESKEY="A1B2C3D4E56F7G8H1I2J3K4L5M6N7O8P1Q2R3S4T5U6V7W8X";
            string DESKEY="A1B2C3D4E56F7G8H1I2J3K4L";
            string txtSource="Hello, world!";
            //Your code goes here
            Console.WriteLine(txtSource);
            
            string EncryptResult = Encrypt3DES(txtSource, DESKEY);
            Console.WriteLine(EncryptResult);
            
            string DecryptResult = Decrypt3DES(EncryptResult, DESKEY);
            Console.WriteLine(DecryptResult);
            
            
        }
        
        /// <summary>
        /// 使用3DES加密
        /// </summary>
        /// <param name="strSource"></param>
        /// <param name="strKey">長度為24字元</param>
        /// <returns></returns>
        public static string Encrypt3DES(string strSource, string strKey)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            //DES.Key = UTF8Encoding.UTF8.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strKey, "md5").Substring(0, 24));
            DES.Key = UTF8Encoding.UTF8.GetBytes(strKey.Substring(0, 24));
            DES.Mode = CipherMode.ECB;
            //DES.Mode = CipherMode.CBC;
            ICryptoTransform DESEncrypt = DES.CreateEncryptor();
            byte[] Buffer = UTF8Encoding.UTF8.GetBytes(strSource);
            return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
        }

        /// <summary>
        /// 使用3DES解密
        /// </summary>
        /// <param name="strEncryptData"></param>
        /// <param name="strKey">長度為24字元/param>
        /// <returns></returns>
        public static string Decrypt3DES(string strEncryptData, string strKey)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            //DES.Key = UTF8Encoding.UTF8.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strKey, "md5").Substring(0, 24));
            DES.Key = UTF8Encoding.UTF8.GetBytes(strKey.Substring(0, 24));
            DES.Mode = CipherMode.ECB;
            //DES.Mode = CipherMode.CBC;
            DES.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            ICryptoTransform DESDecrypt = DES.CreateDecryptor();
            string result = "";
            byte[] Buffer = Convert.FromBase64String(strEncryptData);
            result = UTF8Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
            return result;
        }
    }
    
} 


圖片最下方那三段
第一段:Hello, world! 是顯示原始字串
第二段:uxu5I2SpRlAHUuRksyIPCA==
是3DES 加密 模式用 ECB
第三段:Hello, world! 解密囉

參考文獻:
1. 維基百科
2. [C# WinForm] 使用3DES 及金鑰加密及解密
3. 【C#.Net】使用 AES 演算法為字串加密解密
4. Android TripleDES encrypt/decrypt - 3DES加密(ECB Mode)
5. rextester.com