1. 程式人生 > >雜湊演算法的簡單加密程式

雜湊演算法的簡單加密程式

在c#的Windows學習中我們可以利用簡單的窗體和一些簡單的類來寫一個加密文字的簡單加密程式,既然是簡單的,那麼這個程式就只會加密和解密。

 

圖片介面(我用的vs2010)

新建一個Form介面

兩個TextBox控制元件,四個button控制元件,兩個Lable控制元件

在選擇檔案的時候要用到 openFileDialog控制元件

由於這個很簡單所以我就沒有設定可輸入金鑰 金鑰在寫好的時候已經固定了,如果想要每次加密的時候都自己輸入密碼也可以Tabcontrol控制元件把加密和解密分開 然後就簡單了。

好了 先來說自己設定的密碼  我用的雜湊演算法128位的加密

直接上程式碼(這是加密的時候的):

UTF8Encoding utf = new UTF8Encoding();
byte[] key = utf.GetBytes(textBox2.Text);//我們自己輸入的密碼(解密需要)
byte[] po = utf.GetBytes("a12345678");//另外一個需要自己設定的密碼


HMACMD5 md5 = new HMACMD5(key);(定義雜湊演算法物件)

byte[] edata = md5.ComputeHash(key);(物件呼叫方法)
byte[] sdata = md5.ComputeHash(po);

這是解密的時候的(和上面一樣)

 UTF8Encoding utf = new UTF8Encoding();
 byte[] key = utf.GetBytes(textBox2.Text);
 byte[] po = utf.GetBytes("a12345678");
 HMACMD5 md5 = new HMACMD5(key);
 byte[] edata = md5.ComputeHash(key);
 byte[] sdata = md5.ComputeHash(po);


由於在加密中我們需要這個加密字串的位元組,我們先定義一個utf變數 用以轉換,還要定義位元組陣列來儲存,在加密的過程中我們可以直接利用c#中自己攜帶的加密類來完成加密。

 if (textBox1.Text == "" || textBox2.Text != "123456")
                MessageBox.Show("加密路徑為空,或密碼不正確");
            else
            {
                Jiami jia = new Jiami();//類
                jia.jiami(edata, sdata, textBox1.Text);//key iv 路徑
                label2.Text = "加密成功!";
            }

下面是加密類:

FileStream w = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);//讀取要加密的流
            TripleDESCryptoServiceProvider keys = new TripleDESCryptoServiceProvider();//生成加密物件
            CryptoStream Cry = new CryptoStream(w, keys.CreateDecryptor(key, IV), CryptoStreamMode.Read);//加密流和資料的關聯
            byte[] fromEncrypt = new byte[w.Length];//生成儲存流大小的緩衝區
            Cry.Read(fromEncrypt, 0, fromEncrypt.Length);//將此流讀取到緩衝區
            w.Close();//關閉流
            FileStream s = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);//寫入流的關聯
            s.Write(fromEncrypt, 0, fromEncrypt.Length);//寫入
            Cry.Close();//關閉流
            s.Close();//關閉流

下面是解密在Form類的程式碼:

if (textBox1.Text == "" || textBox2.Text != "123456")
                MessageBox.Show("加密路徑為空,或密碼不正確");
            else
            {
                Jiemi hu = new Jiemi();
                hu.jiemi(edata, sdata, textBox1.Text);
                label2.Text = "解密成功!";
            }

下面是解密類:

FileStream w = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);//讀取要加密的流
            TripleDESCryptoServiceProvider keys = new TripleDESCryptoServiceProvider();//生成加密物件
            CryptoStream Cry = new CryptoStream(w, keys.CreateDecryptor(key, IV), CryptoStreamMode.Read);//加密流和資料的關聯
            byte[] fromEncrypt = new byte[w.Length];//生成儲存流大小的緩衝區
            Cry.Read(fromEncrypt, 0, fromEncrypt.Length);//將此流讀取到緩衝區
            w.Close();//關閉流
            FileStream s = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);//寫入流的關聯
            s.Write(fromEncrypt, 0, fromEncrypt.Length);//寫入
            Cry.Close();//關閉流
            s.Close();//關閉流

可以看出 在初學的時候,vs中已經有了我們要寫的大多數功能的程式碼, 而我們只要在函式中呼叫就可以了,這個也是我在學習中發現網上關於這個的介紹還是不夠多要不然就是自己看不懂,所以在每日的複習中就寫上來了。作為一個新手,還有很多的不足和錯誤 ,歡迎各位大佬指出。