热门标签 | 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

 


推荐阅读
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • JAVA调用存储过程CallableStatement对象的方法及使用示例
    本文介绍了使用JAVA调用存储过程CallableStatement对象的方法,包括创建CallableStatement对象、传入IN参数、注册OUT参数、传入INOUT参数、检索结果和OUT参数、处理NULL值等。通过示例代码演示了具体的调用过程。 ... [详细]
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社区 版权所有