注意事项:
前台使用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);
}
效果图片:
下载链接地址: