js的3des加解密和c#.net後臺解密

注意事項:

前臺使用cryptojs和自定義的加密js方法實現

後臺使用標準的加密算法加密的密碼爲24位非弱健key

前臺代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="_3desEncryt.Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
           
        <meta http-equiv=Content-Type content="text/html;charset=utf-8">        
        <title>加密</title>   
    <script src="jsnew/jquery-2.2.3.min.js" type="text/javascript"></script>
    <script src="jsnew/crypto-js.js" type="text/javascript"></script>
    <script src="jsnew/jsencrypt.js" type="text/javascript"></script>
        <script type="text/javascript">
            //祕鑰key  
            //key不足24位自動以0(最小位數是0)補齊,如果多餘24位,則截取前24位,後面多餘則捨棄掉        
            //加密使用的是3DES中的ECB,解密對應的使用ECB  
            function encrypt(message,key) {
                var base64 = CryptoJS.enc.Utf8.parse(key)
                var encrypt = CryptoJS.TripleDES.encrypt(message, base64, {
                    //iv: CryptoJS.enc.Utf8.parse('01234567'),//iv偏移量  
                    //mode: CryptoJS.mode.CBC,  //CBC模式  
                    mode: CryptoJS.mode.ECB,  //ECB模式  
                    padding: CryptoJS.pad.Pkcs7//padding處理  
                }
            );
                var encryptData = encrypt.toString(); //加密完成後,轉換成字符串  
                return encryptData;
            }
            //解密  
            function decrypt(message,key) {
                var base64 = CryptoJS.enc.Utf8.parse(key)
                var decrypt = CryptoJS.TripleDES.decrypt(message, base64, {
                    //iv: CryptoJS.enc.Utf8.parse('01234567'),  
                    //mode: CryptoJS.mode.CBC,  
                    mode: CryptoJS.mode.ECB,
                    padding: CryptoJS.pad.Pkcs7
                }
            );
                //解析數據後轉爲UTF-8  
                var parseData = decrypt.toString(CryptoJS.enc.Utf8);
                return parseData;
            }  
            function Validation() {
                var messkey = $('#messkey').val();
                var key = "12345678qwertyui87654321";
                var encry = encrypt(messkey, key);
                alert(encry);
                return true;
            }
            function backValidation() {
                var encykey = $('#result').text();
                var key = "12345678qwertyui87654321";
                var desinfo = decrypt(encykey, key);
                alert(desinfo);
                return true;
            }
        </script>   
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="labwait" runat="server" Text="待加密信息"></asp:Label>
        <asp:TextBox ID="messkey" runat="server"></asp:TextBox>
        <asp:Label ID="labkey" runat="server" Text="加密密碼"></asp:Label>
        <asp:TextBox ID="passkey" runat="server"></asp:TextBox>
        <asp:Button ID="btnsub" runat="server" Text="加密" OnClientClick="return Validation();" onclick="btnsub_Click" />
        <asp:Button ID="des" runat="server" Text="解密" OnClientClick="return backValidation();"  onclick="des_Click" />
        <asp:Label ID="Label1" runat="server" Text="加密結果:"></asp:Label>
        <asp:Label ID="result" runat="server" Text=""></asp:Label>
        <asp:Label ID="desresult" runat="server" Text="解密結果:"></asp:Label>
    </div>
    </form>
</body>
</html>

後臺代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Web;

namespace _3desEncryt
{
    /// <summary>
    /// 兩種模式獲得的結果一樣
    /// </summary>
    public static class DESHelper
    {
        #region 3des加密

        /// <summary>
        /// 3des ecb模式加密
        /// </summary>
        /// <param name="aStrString">待加密的字符串</param>
        /// <param name="aStrKey">密鑰</param>
        /// <param name="iv">加密矢量:只有在CBC解密模式下才適用</param>
        /// <param name="mode">運算模式</param>
        /// <returns>加密後的字符串</returns>
        public static string Encrypt3Des(string aStrString, string aStrKey, CipherMode mode = CipherMode.ECB, string iv = "12345678")
        {
            try
            {
                var des = new TripleDESCryptoServiceProvider
                {
                    Key = Encoding.UTF8.GetBytes(aStrKey),
                    Mode = mode
                };
                if (mode == CipherMode.CBC)
                {
                    des.IV = Encoding.UTF8.GetBytes(iv);
                }
                var desEncrypt = des.CreateEncryptor();
                byte[] buffer = Encoding.UTF8.GetBytes(aStrString);
                return Convert.ToBase64String(desEncrypt.TransformFinalBlock(buffer, 0, buffer.Length));
            }
            catch (Exception e)
            {
                return string.Empty;
            }
        }

        #endregion

        #region 3des解密

        /// <summary>
        /// des 解密
        /// </summary>
        /// <param name="aStrString">加密的字符串</param>
        /// <param name="aStrKey">密鑰</param>
        /// <param name="iv">解密矢量:只有在CBC解密模式下才適用</param>
        /// <param name="mode">運算模式</param>
        /// <returns>解密的字符串</returns>
        public static string Decrypt3Des(string aStrString, string aStrKey, CipherMode mode = CipherMode.ECB, string iv = "12345678")
        {
            try
            {
                var des = new TripleDESCryptoServiceProvider
                {
                    Key = Encoding.UTF8.GetBytes(aStrKey),
                    Mode = mode,
                    Padding = PaddingMode.PKCS7
                };
                if (mode == CipherMode.CBC)
                {
                    des.IV = Encoding.UTF8.GetBytes(iv);
                }
                var desDecrypt = des.CreateDecryptor();
                var result = "";
                byte[] buffer = Convert.FromBase64String(aStrString);
                result = Encoding.UTF8.GetString(desDecrypt.TransformFinalBlock(buffer, 0, buffer.Length));
                return result;
            }
            catch (Exception e)
            {
                return string.Empty;
            }
        }
        #endregion

        #region   ECB第二種模式
        /// <summary>
        /// ECB模式加密
        /// </summary>
        /// <param name="key">密鑰</param>
        /// <param name="iv">ECB iv無用</param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] Des3EncodeECB(byte[] key,byte[] iv, byte[] data)
        {
            try
            {
                //byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
                // Create a MemoryStream.  
                MemoryStream mStream = new MemoryStream();
                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.ECB;
                tdsp.Padding = PaddingMode.PKCS7;

                // Create a CryptoStream using the MemoryStream   
                // and the passed key and initialization vector (IV).  

                CryptoStream cStream = new CryptoStream(mStream,
                    tdsp.CreateEncryptor(key, iv),
                    CryptoStreamMode.Write);
                // Write the byte array to the crypto stream and flush it.  
                cStream.Write(data, 0, data.Length);
                cStream.FlushFinalBlock();
                // Get an array of bytes from the   
                // MemoryStream that holds the   
                // encrypted data.  
                byte[] ret = mStream.ToArray();
                // Close the streams.  
                cStream.Close();
                mStream.Close();
                // Return the encrypted buffer.  
                return ret;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
        }

        /// <summary>  
        /// DES3 ECB模式解密  
        /// </summary>  
        /// <param name="key">密鑰</param>  
        /// <param name="iv">IV(當模式爲ECB時,IV無用)</param>  
        /// <param name="str">密文的byte數組</param>  
        /// <returns>明文的byte數組</returns>  
        public static byte[] Des3DecodeECB(byte[] key, byte[] iv, byte[] data)
        {
            try
            {
                // Create a new MemoryStream using the passed   
                // array of encrypted data.  
                MemoryStream msDecrypt = new MemoryStream(data);
                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.ECB;
                tdsp.Padding = PaddingMode.PKCS7;
                // Create a CryptoStream using the MemoryStream   
                // and the passed key and initialization vector (IV).  
                CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                   tdsp.CreateDecryptor(key, iv),
                    CryptoStreamMode.Read);
                // Create buffer to hold the decrypted data.  
                byte[] fromEncrypt = new byte[data.Length];
                // Read the decrypted data out of the crypto stream  
                // and place it into the temporary buffer.  
                csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
                //Convert the buffer into a string and return it.  
                return fromEncrypt;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
        }  

        #endregion

    }
}

調用方式:

       /// <summary>
        /// 加密
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnsub_Click(object sender, EventArgs e)
        {
            var strmess = messkey.Text;
            var strkey = "12345678qwertyui87654321";
            result.Text = DESHelper.Encrypt3Des(strmess,strkey);

        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void des_Click(object sender, EventArgs e)
        {
            var encymess = result.Text;
            var strkey = "12345678qwertyui87654321";
            desresult.Text ="解密結果:" +DESHelper.Decrypt3Des(encymess, strkey);
        }

效果圖片:


下載鏈接地址:


相關文件下載


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章