DES加密的详解

好久没有动手写博客了,来了深圳工作压力确实大,有时候想写点自己的东西,但是每天回来的好晚时不时的通宵,项目赶的非常急,真是从一个坑跳到另外一个坑。。。。。今天自己整理了一下关于数据解密的东西,根据网上一些人的博客,自己实践了一下这个加密算法,但是中间还是遇到了坑。。。。。有些人写的复杂,现在将其整理如下:

public class StringEncryption{
    // 加密秘钥
    private static string EncryptDES = {0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};

    // entryptString 为要加密的字符串
    // entryptKey 秘钥
    public static string EncryptDES (String encryptString, String encryptKey)
    {
        try{
            // 截取前八位为秘钥
            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();
            // 创建加密流对象
            CryptoStrem cStream = new CryptStream(mSteam, dcsp.CreateEncrotor(rgbKey, rgbIV), CryptoStremModel.Write);

            // 将字节流写入加密流对象
            cStream.Write(inputByteArray, 0, inputByteArray.Length);

            // 将数据压入基础流,用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。
            cStream.FlushFinalBlock();

            // 关闭加密流对象
            cStream.Close();

            // 关闭内存流对象
            mStream.Close();

            return Convert.ToBase64String(mStream.ToArray());

        }
        catch{
            return encryptString;
        }
    }

    public static string DecryptDES(String descrypString, String descryptKey)
    {
        try{
            // 将秘钥转化为字节
            byte[] rgbKeys = Encoding.UTF8.GetBytes(descryptKey);
            byte[] keyIV = keys;

            // 将密文转换为字节
            byte[] inputByteArray = Encoding.UTF8.GetBytes(descrypString);

            // 创建加密转换器
            DESCryptoServiceProvider dcsp = new DESCryptoServiceProvider();

            // 方法一    通过对解密流对象进行读操作将解密后的数据读取出来
            // 创建内存流对象 并将密文传给它
            MemoryStream mStream = new MemoryStream(inputByteArray);

            // 创建解密流对象
            CryptStream cStream = new CryptStream( mStream, dcsp.CreateDecrotor(rgbKeys,rgbIV), CryptoStremModel.Read);

            //重新声明一个字节数组用来存放解密后的数据 
            byte[] finalBytes = new byte[cStream.ToArray().Length];

            // 重解密流对象中 从位置为0开始读取长度为 cStream.ToArray().Length 的密文 ,并放入finalBytes数组
            cStream.Read(finalBytes, 0, cStream.ToArray().Length);

            // 方法二   通过写的方式,向解密流对象中写入要解密的数据,再直接从内存流中将解密后的值取出来
            /*

            // 创建内存流对象 并将密文传给它
            MemoryStream mStream = new MemoryStream();

            // 创建解密流对象
            CryptStream cStream = new CryptStream( mStream, dcsp.CreateDecrotor(rgbKeys,rgbIV), CryptoStremModel.Write);

            cStream.Write(inputByteArray, 0, inputByteArray.Length);

            cStream.FlushFinalBlock();

            return Encoding.UTF8.GetString(mStream.ToArray());

            用了网上一些人的方法直接返回 cStream.ToArray(), 返回的对象是乱码。这是错误的!!!!
            因为数据是放在内存流中的,要从内存流中将其取出来或者调用 cStream.Read()d的方法将数据从解密流对象中读取出来放入声明的数组(如上所示)

            */

            return Encoding.UTF8.GetString(finalBytes);
        }
        catch
        {
            return descrypString
        }
    }
}


若有补充的,欢迎交流!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值