在.NET Core 里使用 BouncyCastle 的DES加密算法
发布日期:2021-05-09 06:33:41 浏览次数:2 分类:博客文章

本文共 2589 字,大约阅读时间需要 8 分钟。

.NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章《》需要用Nodejs,很多人觉得这个有点不好,今天就给大家介绍下BouncyCastle (Portable.BouncyCastle)库为我们提供的原生的.NET Core的支持库的Des算法。BouncyCastle的文档比较少,折腾了好久才写出了.NET 代码等价的一个封装。

  public class TDesbouncy

    {

        IBlockCipher engine = new DesEngine();

        /// <summary>

        /// 使用DES加密,key输入密码的时候,必须使用英文字符,区分大小写,且字符数量是8个,不能多也不能少
        /// </summary>
        /// <param name="plainText">需要加密的字符串</param>
        /// <param name="keys">加密字符串的密钥</param>
        /// <returns>加密后的字符串</returns>
        public string Encrypt(string keys, string plainText)
        {

            byte[] ptBytes = Encoding.UTF8.GetBytes(plainText);

            byte[] rv = Encrypt(keys, ptBytes);
            StringBuilder ret = new StringBuilder();
            foreach (byte b in rv)
            {
                ret.AppendFormat("{0:X2}", b);
            }
            return ret.ToString();
        }

        private byte[] Encrypt(string keys, byte[] ptBytes)

        {
            byte[] key = Encoding.UTF8.GetBytes(keys);
            BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine),new Pkcs7Padding());
            cipher.Init(true, new ParametersWithIV(new DesParameters(key),key));
            byte[] rv = new byte[cipher.GetOutputSize(ptBytes.Length)];
            int tam = cipher.ProcessBytes(ptBytes, 0, ptBytes.Length, rv, 0);

             cipher.DoFinal(rv, tam);

             return rv;
        }

        /// <summary>

        /// 使用DES解密,key输入密码的时候,必须使用英文字符,区分大小写,且字符数量是8个,不能多也不能少
        /// </summary>
        /// <param name="cipherText">需要加密的字符串</param>
        /// <param name="keys">加密字符串的密钥</param>
        /// <returns>解密后的字符串</returns>
        public string Decrypt(string keys, string cipherText)
        {
            byte[] inputByteArray = new byte[cipherText.Length / 2];
            for (int x = 0; x < cipherText.Length / 2; x++)
            {
                int i = (Convert.ToInt32(cipherText.Substring(x * 2, 2), 16));
                inputByteArray[x] = (byte)i;
            }
            var rv = Decrypt(keys, inputByteArray);

            return Encoding.UTF8.GetString(rv);

        }

        private byte[] Decrypt(string keys, byte[] cipherText)

        {
            byte[] key = Encoding.UTF8.GetBytes(keys);
            BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine));
            cipher.Init(false, new ParametersWithIV(new DesParameters(key), key));
            byte[] rv = new byte[cipher.GetOutputSize(cipherText.Length)];
            int tam = cipher.ProcessBytes(cipherText, 0, cipherText.Length, rv, 0);

            cipher.DoFinal(rv, tam);

            return rv;

        }

    }

public static void Main(string[] args)

{
           
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            string key = "geffzhan";

            string content =   "This project.config whoopla is a mess. So what they mean by .NetCore, you still have to reference everything correctly";

            TDesbouncy bouncy = new TDesbouncy();

            var encrypt = bouncy.Encrypt(key, content);

            Console.WriteLine(encrypt);

            string descontent = bouncy.Decrypt(key, encrypt);

            Console.WriteLine(descontent);
}

转载地址:https://www.cnblogs.com/shanyou/p/6135340.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【新书推荐】《微软开源跨平台移动开发实践》--带你走近微软开源开源跨平台技术
下一篇:tLinux 2.2下安装Mono 4.8

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2023年09月19日 10时31分36秒