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);
        }

效果图片:

下载链接地址:

相关文件下载

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值