DES加密深度优化——随机生成加密字符串

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。但该算法一旦密钥固定,加密的字符串也就随之固定,这不利于数据存储安全。而且用该方法加密后有一个显著的标记,末位几位为‘=’。所有本次优化对密钥和去等进行了一些优化。

首先我们生成8位随机字符串作为加密的key值。

  private static string so = "1234567890abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM";

        /// <summary>
        /// 生成内容随机key
        /// </summary>
        /// <returns></returns>
        public static string GetContent()
        {
            Random rand = new Random();
            string str = null;
            for (int i = 0; i < 8; i++)
            {
                str += so.Substring(rand.Next(62), 1);
            }
            return str;
        }

然后将key值进行拆分为两部分。

   Random rand = new Random();
                int r = rand.Next(9);
                string encryptKey = GetContent();
                string first = encryptKey.Substring(0, r);
                string last = encryptKey.Substring(r);

最后对需加密的字符串进行DES加密,并记录等号的个数并截取去除等号字符串,然后与key值左右部分拼接。

    private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
        /// <summary>
        /// DES加密字符串
        /// </summary>
        /// <param name="encryptString">待加密的字符串</param>
        /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
        public static string Encrypt(string encryptString)
        {
            try
            {
                Random rand = new Random();
                int r = rand.Next(9);
                string encryptKey = GetContent();
                string first = encryptKey.Substring(0, r);
                string last = encryptKey.Substring(r);

                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                DESCryptoServiceProvider dCsp = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, dCsp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                string str = Convert.ToBase64String(mStream.ToArray());
                int i = 0;
                for (int j = str.Length - 1; j > 0; j--)
                {
                    if (str[j] != ‘=‘)
                    {
                        break;
                    }
                    else
                    {
                        i++;
                    }
                }
                str = str.Substring(0, str.Length - i);
                return i.ToString()+r.ToString()+first + str +last;
            }
            catch
            {
                return encryptString;
            }
        }

对加密的字符串进行解密。

    /// <summary>
        /// DES解密字符串
        /// </summary>
        /// <param name="decryptString">待解密的字符串</param>
        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
        public static string Decrypt(string decryptString)
        {
            try
            {
                int code = Int32.Parse(decryptString.Substring(1, 1));
                int i = Int32.Parse(decryptString.Substring(0, 1));

                string first = decryptString.Substring(2, code);
                string last = decryptString.Substring(decryptString.Length - 8 + code);
                string encryptKey =first+last;
                decryptString = decryptString.Substring(code + 2, decryptString.Length - 10);
                for (int j = 0; j < i; j++)
                {
                    decryptString += "=";
                }
                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey);
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Convert.FromBase64String(decryptString);
                DESCryptoServiceProvider dcsp = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, dcsp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(mStream.ToArray());
            }
            catch
            {
                return decryptString;
            }
        }

应用及演示:

   public static void Main(string[] args)
        {
            string str = "xuhang";
            for (int i = 0; i < 10; i++)
            {
                var m = DesNew.Encrypt(str);
                Console.WriteLine(m);
                Console.WriteLine(DesNew.Decrypt(m));
                Console.WriteLine("------------------------------");
                Thread.Sleep(500); //0.5s后唤醒线程,避免由于时间短生成的数据一致
            }
        }

时间: 2024-10-01 06:50:13

DES加密深度优化——随机生成加密字符串的相关文章

(转)DES、RSA、MD5、SHA、随机生成加密与解密

一.数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1.常用密钥算法 密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合: 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高: RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快: IDEA(International Data Encrypti

DES、RSA、MD5、SHA、随机生成加密与解密

一.数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1.常用密钥算法 密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合: 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高: RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快: IDEA(International Data Encrypti

python内置的一个好玩的函数-zip,并且巧妙的实现按概率随机生成有限个数的字符串。

python有一个比较有意思的内置函数-----zip,可以把传入的两组list进行一个组合变形,再输出子元素为tuple的list,不过变形的方式比较抽象. 举个例子: A=[1,2,3,4,5,6] B=['a','b','c','d'] v1=zip(A,B) v1的结果为: [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')] 比较直观的理解就是,A和B是两道拉链上的扣子,生成的list的子tuple,每一组tuple就是一对扣好了的扣子,并且从每组list的

java随机生成字符串并排序

1 package com.Imooc; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Random; 7 8 /** 9 * 利用Collections.sort()方法对泛型为String的List进行排序 10 * 1. 创建List<String>之后往其中添加十条随机字符串 11 * 2. 每条字符串为10以内的随机

随机生成模块

import random print(random.randint(1,4))#从1到4随机生成一个数字 print(random.randrange(1,4))#从1到3随机生成一个数字,不包含3 print(random.randrange(1,10,2))#1到9随机生成一个基数 print(random.randrange(0,10,2))#1到9随机生成一个偶数 print(random.random())#随机生成一个浮点数,范围是0-1之间 print(random.unifor

各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语言时这类可逆函数非常难搞定.所以这时尽量使用AES DES RC4 Rabbit TripleDes这些方法. 包含超时的加密解密函数 1 /** 2 * 加密 3 * @param string $string 要加密或解密的字符串 4 * @param string $operation 加密 '' 解密 DECODE 5 * @param string $key 密钥

PHP DES解密 对应Java SHA1PRNG方式加密

背景及问题 背景:在和外部系统通过HTTP方式跳转时, 为保障传输参数安全性, 采用AES 加密参数. 关于对称加密中 AES, DES, CBC, ECB, PKCS5Padding 概念可参考https://blog.csdn.net/qq_35698774/article/details/78964249 问题:  我方技术java, 对方使用PHP.  使用同样加密算法DES, 加密模式ECB, 填充方式PKCS5Padding, 编码处理BASE64, 解密仍失败. 最终发现原因: J

IOS中把字符串加密/IOS中怎么样MD5加密/IOS中NSString分类的实现

看完过后,你会学到: 1学习IOS开发中的分类实现, 2以及类方法的书写, 3以及字符串的MD5加密/解密. ---------------------------wolfhous------------------ [1]新建工程,新建分类 [2]分类的命名方式以及类的选择 [3]书写NSString分类的类方法,以及实现类方法,以及MD5如何加密 [4]测试加密结果 [5]解密:直接百度MD5解密,随便点歌网站进去,输入解密KEY,在我这个Demo中, wolfhous正常加密44bf025

将字符串 由一个字符集 转成 另一个字符集 及 随机生成中文

今天遇到了一个麻烦 字符集的转换 因为这个网页是utf-8的  但是他获取了一个gbk的数据库 所以为了统一字符集必须要将获取的gbk数据转成utf-8 刚开始我的思路是acsii值得转换  先以gbk的字符集获取数据 然后 用mb_substr($str,$start,$len,'gbk') 来截取一个中文 然后在用ord()获取他的ascii值 之后用chr() 把ascii值转成中文   原理:字符的ascii是不变的  无论它是gbk 还是 utf-8 但是我发现输出的是一个乱码[无论是