热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3DES加解密,对长度不限制

#region3DES<summary>3DES加密<summary>
#region 3DES
        /// 
        /// 3DES加密
        /// 
        /// 需加密的字符串
        /// 密匙
        /// 
        public static string DES3Encrypt(string strString, string strKey)
        {
            strString = strString + "".PadLeft(8);
            byte[] bMsg = Encoding.GetEncoding("GBK").GetBytes(strString);

            int l = (bMsg.Length / 16 + 1) * 16;
            byte[] btMsg = new byte[l];
            Array.Copy(bMsg, btMsg, bMsg.Length);

            byte[] digestOfPassword = Encoding.Default.GetBytes(strKey);
            byte[] keyBytes = new byte[24];
            Array.Copy(digestOfPassword, keyBytes, digestOfPassword.Length);
            for (int j = 0, k = 16; j <8; )
            {
                keyBytes[k++] = keyBytes[j++];
            }
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            DES.Mode = CipherMode.ECB;
            ICryptoTransform DESEncrypt = DES.CreateEncryptor(keyBytes, keyBytes);
            var dd = DESEncrypt.TransformFinalBlock(btMsg, 0, btMsg.Length);
            return byte2hex(dd).ToString().Substring(0, (bMsg.Length / 8 + 1) * 16);
        }

        public static String getAdd(int length, String strKey)
        {
            byte[] btMsg = new byte[length / 2];

            byte[] digestOfPassword = Encoding.UTF8.GetBytes(strKey);
            //byte[] digestOfPassword = Encoding.Default.GetBytes(strKey);
            byte[] keyBytes = new byte[24];
            Array.Copy(digestOfPassword, keyBytes, digestOfPassword.Length);
            for (int j = 0, k = 16; j <8; )
            {
                keyBytes[k++] = keyBytes[j++];
            }

            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            DES.Mode = CipherMode.ECB;
            ICryptoTransform DESEncrypt = DES.CreateEncryptor(keyBytes, keyBytes);
            var dd = DESEncrypt.TransformFinalBlock(btMsg, 0, btMsg.Length);
            String rtn = byte2hex(dd);
            return rtn.Substring(length);
        }

        ///  
        /// 字节数组转16进制字符串 
        ///  
        ///  
        ///  
        private static string byte2hex(byte[] dd)
        {
            StringBuilder ret = new StringBuilder();
            foreach (var item in dd)
            {
                ret.AppendFormat("{0:X2}", item);
            }
            return ret.ToString();
        }
        ///  
        /// 字符串转16进制字节数组 
        ///  
        ///  
        ///  
        private static byte[] strToToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i )
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }
        /// 
        /// 3DES解密
        /// 
        /// 需解密的字符串
        /// 密匙
        /// 
        public static string DES3Decrypt(string strString, string strKey)
        {
            strString += getAdd(strString.Length, strKey);

            byte[] digestOfPassword = Encoding.Default.GetBytes(strKey);
            byte[] keyBytes = new byte[24];
            Array.Copy(digestOfPassword, keyBytes, digestOfPassword.Length);
            for (int j = 0, k = 16; j <8; )
            {
                keyBytes[k++] = keyBytes[j++];
            }
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            DES.Mode = CipherMode.ECB;
            ICryptoTransform DESDecrypt = DES.CreateDecryptor(keyBytes, keyBytes);
            string result = "";
            try
            {
                byte[] Buffer = strToToHexByte(strString);
                byte[] bb = DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length);
                result = Encoding.GetEncoding("GBK").GetString(bb);
            }
            catch (Exception e)
            {
                throw e;
            }
            return result;
        }
        #endregion

 2015-1-13 添加

在我传递key时,出现

指定键的大小对于此算法无效。和 <wbr>指定的初始化向量(IV)与此算法的块大小不匹配。错误处理

查资料,原来是key的长度大于24了,(IV则是8位,但我没有传递)

修改后的3DES算法

#region 3DES
        /// 
        /// 3DES加密
        /// 
        /// 需加密的字符串
        /// 密匙
        /// 
        public static string DES3Encrypt(string strString, string strKey)
        {
            byte[] bMsg = Encoding.UTF8.GetBytes(strString);
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            DES.Mode = CipherMode.ECB;

            string key = strKey;
            while (key.Length <24)
            {
                key += strKey;
            }
            byte[] digestOfPassword = Encoding.UTF8.GetBytes(key);
            byte[] keyBytes = new byte[24];
            Array.Copy(digestOfPassword.Take(24).ToArray(), keyBytes, digestOfPassword.Take(24).ToArray().Length);

            DES.Key = keyBytes;
            ICryptoTransform DESEncrypt = DES.CreateEncryptor();
            var dd = DESEncrypt.TransformFinalBlock(bMsg, 0, bMsg.Length);
            return Convert.ToBase64String(dd);
        }

        /// 
        /// 3DES解密
        /// 
        /// 需解密的字符串
        /// 密匙
        /// 
        public static string DES3Decrypt(string strString, string strKey)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            DES.Mode = CipherMode.ECB;
            string key = strKey;
            while (key.Length <24)
            {
                key += strKey;
            }
            byte[] digestOfPassword = Encoding.UTF8.GetBytes(key);
            byte[] keyBytes = new byte[24];
            Array.Copy(digestOfPassword.Take(24).ToArray(), keyBytes, digestOfPassword.Take(24).ToArray().Length);
            DES.Key = keyBytes;
            ICryptoTransform DESDecrypt = DES.CreateDecryptor();
            string result = "";
            try
            {
                byte[] Buffer = Convert.FromBase64String(strString);
                byte[] bb = DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length);
                result = Encoding.UTF8.GetString(bb);
            }
            catch (Exception e)
            {
                throw e;
            }
            return result;
        }
        #endregion

 


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
QJ974
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有