2016年11月22日 星期二

[研究] [C#] AES-256-CBC 加密字串、解密字串

[研究] [C#] AES-256-CBC 加密字串、解密字串

2016-11-22


Visual Studio 2015 with Update 3
WinForm 程式

Form1.cs

using System;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace AES256CBCEncryptString
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "1234567812345678"; // key, iv
            textBox2.Text = "1234567812345678"; // key, iv
            richTextBox1.Text = "Test String";
        }
        private void button1_Click(object sender, EventArgs e)
        {
            String encryptData = Encrypt(richTextBox1.Text, textBox1.Text, textBox2.Text);
            richTextBox2.Text = encryptData;

            String decryptData = Decrypt(richTextBox2.Text, textBox1.Text, textBox2.Text);
            richTextBox3.Text = decryptData;
        }
        public static string Encrypt(string toEncrypt, string key, string iv)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            //進階加密標準(英語:Advanced Encryption Standard,縮寫:AES)
            //https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86

            // RijndaelManaged 類別
            // https://msdn.microsoft.com/zh-tw/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx

            //區塊(Block)密碼工作模式(mode of operation)
            //https://zh.wikipedia.org/wiki/%E5%9D%97%E5%AF%86%E7%A0%81%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.KeySize = 256;
            rDel.Key = keyArray;
            rDel.IV = ivArray;  // 初始化向量 initialization vector (IV)
            rDel.Mode = CipherMode.CBC; // 密碼分組連結(CBC,Cipher-block chaining)模式
            rDel.Padding = PaddingMode.Zeros;

            ICryptoTransform cTransform = rDel.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        public static string Decrypt(string toDecrypt, string key, string iv)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
            byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.KeySize = 256;
            rDel.Key = keyArray;
            rDel.IV = ivArray;
            rDel.Mode = CipherMode.CBC;
            rDel.Padding = PaddingMode.Zeros;

            ICryptoTransform cTransform = rDel.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return UTF8Encoding.UTF8.GetString(resultArray);
        }


    }
}



(完)

沒有留言:

張貼留言