Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >3DES 加密与解密

3DES 加密与解密

作者头像
用户1220053
发布于 2018-02-09 03:36:37
发布于 2018-02-09 03:36:37
2.2K0
举报
文章被收录于专栏:DT乱“码”DT乱“码”
代码语言:js
AI代码解释
复制
     /// <summary>
     /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码)
     /// </summary>
     public class Crypto3DES
     {
         /// <summary>
         /// 默认密钥
         /// </summary>
         private string Keys;
        /// <summary>
         /// 密钥与加密字符串不足8字符时的填充字符
         /// </summary>
         private char paddingChar = ' ';
        /// <summary>
         /// 实例化 Crypto3DES 类
         /// </summary>
         /// <param name="key">密钥</param>
         public Crypto3DES(string key)
         {
             this.Keys = key;
         }
        /// <summary>
         /// 获取密钥,不足8字符的补满8字符,超过8字符的截取前8字符
         /// </summary>
         /// <param name="key">密钥</param>
         /// <returns></returns>
         private string GetKeyCode(string key)
         {
             if (key.Length > 8)
                 return key.Substring(0, 8);
             else
                 return key.PadRight(8, paddingChar);
         }
        /// <summary>
         /// 获取加密字符串,不足8字符的补满8字符
         /// </summary>
         /// <param name="strString">The STR string.</param>
         /// <returns></returns>
         private string GetString(string strString)
         {
             if (strString.Length < 8)
                 return strString.PadRight(8, paddingChar);
             return strString;
         }
        /// <summary>
         /// 加密
         /// </summary>
         /// <param name="strString">加密字符串</param>
         /// <returns></returns>
         public string Encrypt(string strString)
         {
             try
             {
                 strString = this.GetString(strString);
                 DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                 DES.Key = Encoding.UTF8.GetBytes(this.GetKeyCode(this.Keys));
                 DES.Mode = CipherMode.ECB;
                 DES.Padding = PaddingMode.Zeros;
                 ICryptoTransform DESEncrypt = DES.CreateEncryptor();
                 byte[] Buffer = Encoding.UTF8.GetBytes(strString);
                 return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
             }
             catch (Exception ex) { return ex.Message; }
         }
        /// <summary>
         /// 解密
         /// </summary>
         /// <param name="strString">解密字符串</param>
         /// <returns></returns>
         public string Decrypt(string strString)
         {
             try
             {
                 DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                 DES.Key = Encoding.UTF8.GetBytes(this.GetKeyCode(this.Keys));
                 DES.Mode = CipherMode.ECB;
                 DES.Padding = PaddingMode.Zeros;
                 ICryptoTransform DESDecrypt = DES.CreateDecryptor();
                 byte[] Buffer = Convert.FromBase64String(strString);
                 return UTF8Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)).Replace("\0", "").Trim();
             }
             catch (Exception ex) { return ex.Message; }
         }
        #region DESEnCode DESDeCode
         /// <summary>
         /// 加密 与Java通用加密
         /// </summary>
         /// <param name="pToEncrypt">需要加密的字符</param>
         /// <param name="cryptKey">密钥,8位的ASCII字符</param>
         /// <returns></returns>
         public string DESEnCode(string pToEncrypt)
         {
             if (string.IsNullOrEmpty(pToEncrypt)) return string.Empty;
            try
             {
                 pToEncrypt = System.Web.HttpContext.Current.Server.UrlEncode(pToEncrypt);
                 string key = this.Keys;
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                 byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);
                 des.Key = ASCIIEncoding.ASCII.GetBytes(key);
                 des.IV = ASCIIEncoding.ASCII.GetBytes(key);
                 System.IO.MemoryStream ms = new System.IO.MemoryStream();
                 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                 cs.Write(inputByteArray, 0, inputByteArray.Length);
                 cs.FlushFinalBlock();
                 StringBuilder ret = new StringBuilder();
                 foreach (byte b in ms.ToArray())
                 {
                     ret.AppendFormat("{0:X2}", b);
                 }
                cs.Close();
                 cs.Dispose();
                 ms.Close();
                 ms.Dispose();
                return ret.ToString();
             }
             catch (System.Exception ex)
             {
                 return ex.Message;
             }
        }
         /// <summary> 
         /// 解密数据  与Java通用解密
         /// </summary> 
         /// <param name="pToEncrypt">解密的字符</param>
         /// <param name="cryptKey">密钥,8位的ASCII字符</param>
         /// <returns></returns> 
         public string DESDeCode(string pToEncrypt)
         {
             if (string.IsNullOrEmpty(pToEncrypt)) return string.Empty;
            try
             {
                 DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                int len = pToEncrypt.Length / 2;
                 byte[] inputByteArray = new byte[len];
                 int x, i;
                for (x = 0; x < len; x++)
                 {
                     i = Convert.ToInt32(pToEncrypt.Substring(x * 2, 2), 16);
                     inputByteArray[x] = (byte)i;
                 }
                string key = this.Keys;
                des.Key = ASCIIEncoding.ASCII.GetBytes(key);
                 des.IV = ASCIIEncoding.ASCII.GetBytes(key);
                 System.IO.MemoryStream ms = new System.IO.MemoryStream();
                 CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                 cs.Write(inputByteArray, 0, inputByteArray.Length);
                 cs.FlushFinalBlock();
                string ret = System.Web.HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));
                cs.Close();
                 cs.Dispose();
                 ms.Close();
                 ms.Dispose();
                return ret;
             }
             catch (System.Exception ex)
             {
                 return ex.Message;
             }
         }
         #endregion
     }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#封装的DES加密、解密类代码
这个C#类封装的DES加密解密,可以使用默认秘钥进行加密、解密,也可以自定义秘钥进行加密、解密,调用简单方便。
用户7108768
2021/11/03
1.4K0
Md5加密秘钥加密哈希加密
加密通用类: public class EncryptClass { /// <summary> /// 返回MD5加密字符串 /// </summary> /// <param name="EncString"></param> /// <returns></returns> public static string GetMd5String(string EncString)
用户1055830
2018/01/18
6.3K1
DotNet中几种常用的加密算法
彭泽0902
2018/01/04
7840
c#通用登录模块,简单好用,一贴见效
// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统 //可以分3个userType, user ,shop , system //网站后台一般都有角色,如admin,employee //那么网站的角色就有 user,shop,admin,employee,但是admin和employee在一个客户端是不能同时登陆的,所以他们是同一类用户(system) 使用方法: 1、添加一个类LoginUser.cs 代码如下: 代码: namespace MVCCommonAut
阿炬
2018/05/11
1.1K2
那些常用的加密算法
MD5加密是最常见的加密方式,因为MD5是不可逆的,所以很多系统的密码都是用MD5加密保存的。
Kiba518
2020/11/26
1.2K0
那些常用的加密算法
【Unity3D】存档文件加密代码
存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改playerPrefs.cs
py3study
2020/01/08
5650
C#开发中常用的加密解密方法
相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法:
用户7053485
2020/03/19
2K0
C#加解密
加密解密在开发中经常用到,比如登录密码加密解密、消息传输加密解密等。但是很多人只会使用不理解其中的原理,这篇文章就带领大家快速学习加密解密的原理和使用。
喵叔
2020/09/08
1.1K0
dotnet MD5
MD5 加密解密算法 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Watch { class DES { // 创建Key public strin
sofu456
2020/05/04
8560
Asp.Net 加密解密
#region DES加密解密 /// <summary> /// DES加密 /// </summary> /// <param name="strSource">待加密字串</param> /// <param name="key">32位Key值</param> /// <returns>加密后的字符串</returns> public string DESEncrypt(string strSource) { return DESEncrypt(strSource, DESKey); } public string DESEncrypt(string strSource, byte[] key) { SymmetricAlgorithm sa = Rijndael.Create(); sa.Key = key; sa.Mode = CipherMode.ECB; sa.Padding = PaddingMode.Zeros; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write); byte[] byt = Encoding.Unicode.GetBytes(strSource); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } /// <summary> /// DES解密 /// </summary> /// <param name="strSource">待解密的字串</param> /// <param name="key">32位Key值</param> /// <returns>解密后的字符串</returns> public string DESDecrypt(string strSource) { return DESDecrypt(strSource, DESKey); } public string DESDecrypt(string strSource, byte[] key) { SymmetricAlgorithm sa = Rijndael.Create(); sa.Key = key; sa.Mode = CipherMode.ECB; sa.Padding = PaddingMode.Zeros; ICryptoTransform ct = sa.CreateDecryptor(); byte[] byt = Convert.FromBase64String(strSource); MemoryStream ms = new MemoryStream(byt); CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Read); StreamReader sr = new StreamReader(cs, Encoding.Unicode); return sr.ReadToEnd(); }
用户8671053
2021/11/02
2.2K0
3des算法源码
using System; using System.Text; using System.IO; using System.Security.Cryptography; class Class1 { static void Main() {   Console.WriteLine("Encrypt String...");   txtKey = "tkGGRmBErvc=";   btnKeyGen();   Console.WriteLine("Encrypt Key :{0}",txtKey);   txtIV = "Kl7ZgtM1dvQ=";   btnIVGen();   Console.WriteLine("Encrypt IV :{0}",txtIV);   Console.WriteLine();   string txtEncrypted = EncryptString("1111");   Console.WriteLine("Encrypt String : {0}",txtEncrypted);   string txtOriginal = DecryptString(txtEncrypted);   Console.WriteLine("Decrypt String : {0}",txtOriginal); } private static SymmetricAlgorithm mCSP; private static string txtKey; private static string txtIV; private static void btnKeyGen() {   mCSP = SetEnc();   byte[] byt2 = Convert.FromBase64String(txtKey);   mCSP.Key = byt2; } private static void btnIVGen() {   byte[] byt2 = Convert.FromBase64String(txtIV);   mCSP.IV = byt2; } private static string EncryptString(string Value) {   ICryptoTransform ct;   MemoryStream ms;   CryptoStream cs;   byte[] byt;   ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);   byt = Encoding.UTF8.GetBytes(Value);   ms = new MemoryStream();   cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);   cs.Write(byt, 0, byt.Length);   cs.FlushFinalBlock();   cs.Close();   return Convert.ToBase64String(ms.ToArray()); } private static string DecryptString(string Value) {   ICryptoTransform ct;   MemoryStream ms;   CryptoStream cs;   byte[] byt;   ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);   byt = Convert.FromBase64String(Value);   ms = new MemoryStream();   cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);   cs.Write(byt, 0, byt.Length);   cs.FlushFinalBlock();   cs.Close();   return Encoding.UTF8.GetString(ms.ToArray()); } private static SymmetricAlgorithm SetEnc() {   return new DESCryptoServiceProvider(); } } 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样, 3
py3study
2020/01/10
7330
C#中CA加密与DES加密的混合使用
这段时间搞了个接口加密的重写,感觉信息的加密在数据传输中还是比较重要的,小小的研究了下,做点笔记,以备查阅。
code2roc
2023/07/19
2970
ASP.MVC当URL跳转时候参数的安全性
      一个页面跳转到另外一个页面直接将参数写在URL上面并不安全比如 http://XXXXXXXXXXX/meeting/shakeGroup?id=5381&uid=o0En_sj1J0bF
用户1055830
2018/01/18
1.4K0
ASP.MVC当URL跳转时候参数的安全性
.net core建站踩坑记录
services.AddOptions(); services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
易墨
2018/09/14
9690
.net core建站踩坑记录
C# DES (ECB模式) 加密解密 –单倍长「建议收藏」
加密: 调用时: Encrypt_DES16(“2AF349243535BCD3”, “1111111111111111”);
全栈程序员站长
2022/07/11
8670
DES/3DES/AES加密
数据加密算法DES 数据加密算法(Data EncryptionAlgorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自 IBM的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。 DES 使用一个 56位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。 *** DES的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced EncryptionStandard,AES)。 DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。 IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。 由于DES是加(解)密64位明(密)文,即为8个字节(8*8=64),可以据此初步判断这是分组加密,加密的过程中会有16次循环与密钥置换过程,据此可以判断有可能是用到DES密码算法,更精确的判断还得必须懂得一点DES的加密过程。 Crackme实例分析 本期Crackme用到MD5及DES两种加密算法,难度适中。这次我们重点来看一下DES的加密过程及注册算法过程。用调试器载入程序,下GegDlgItemTextA断点,可以定位到下面代码,我们先来看一下整个crackme的注册过程: 由于代码分析太长,故收录到光盘中,请大家对照着分析(请见光盘“code1.doc”) 从上面分析可以看出,注册过程是类似:f(机器码,注册码)式的两元运算。机器码是经过md5算法得到的中间16位值,注册码是经过DES解密过程取得16位注册码,然后两者比较,如相等,则注册成功。机器码的运算过程可以参照上一期的MD5算法来理解。下面重点来说一下注册码DES的运算过程。 1、密钥处理过程:一般进行加解密过程都要初始化密钥处理。我们可以跟进004023FA CALL Crackme1.00401A40这个call,可以看到如下代码: …(省略)... 00401A4D LEA ECX,DWORD PTR DS:[ECX] 00401A50 /MOV EDX,EAX 00401A52 |SHR EDX,3 00401A55 |MOV DL,BYTE PTR DS:[EDX+ESI] 00401A58 |MOV CL,AL 00401A5A |AND CL,7 00401A5D |SAR DL,CL 00401A5F |AND DL,1 00401A62 |MOV BYTE PTR DS:[EAX+417DA0],DL 00401A68 |INC EAX 00401A69 |CMP EAX,40 这里比较是否小于64 00401A6C \JL SHORT Crackme1.00401A50 以上过程就是去掉密钥各第八位奇偶位。 …(省略)... 00401AB0 |MOV DL,BYTE PTR DS:[ECX+417D9F] 00401AB6 |MOV BYTE PTR DS:[EAX+417BA3],DL 00401ABC |ADD EAX,4 00401ABF |CMP EAX,38 这里进行密钥变换 …(省略)... 00401BFF ||MOVSX ECX,BYTE PTR DS:[EAX+412215] 00401C06 ||MOV CL,BYTE PTR DS:[ECX+417D9F] 00401C0C ||MOV BYTE PTR DS:[EAX+417BA5],CL 00401C12 ||ADD EAX,6 00401C15 ||CMP EAX,30 这里产生48位的子密钥 00401C18 |\JL SHORT Crackme1.00401BA0 00401C1A |MOV EAX,DWORD PTR SS:[ESP+14]
py3study
2020/01/08
1.2K0
一款实用的.NET Core加密解密工具类库
在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类可以直接调用,那这样可以节省不少的开发时间。今天推荐一款实用的.NET Core加密解密工具类库:NETCore.Encrypt。
追逐时光者
2023/11/20
3390
一款实用的.NET Core加密解密工具类库
[C#] 常用工具类——加密解密类
using System; using System.Configuration; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.
跟着阿笨一起玩NET
2018/09/19
1.6K0
在.NET Core 里使用 BouncyCastle 的DES加密算法
.NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章《使用 JavaScriptService 在.NET Core 里实现DES加密算法》需要用Nodejs,很多人觉得这个有点不好,今天就给大家介绍下BouncyCastle (Portable.BouncyCastle)https://www.nuget.org/packages/Portable.BouncyCastle/库为我们提供的原生的.NET Core的支持库的Des算法。BouncyCastle的文档
张善友
2018/01/19
1.7K0
C#对字符串进行加密解密
明志德道
2023/10/21
4790
C#对字符串进行加密解密
相关推荐
C#封装的DES加密、解密类代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档