码迷,mamicode.com
首页 > Windows程序 > 详细

EncryptionAndDecryptionC# 加密 解密

时间:2019-10-22 18:25:35      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:from   ida   bytes   rtp   name   too long   threading   oar   sub   

 

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace RSA_Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            //生成公钥私钥
            RSAKey rsaKey = RsaUtil.GetRSAKey();
            WriteLine($"PrivateKey:{rsaKey.PrivateKey}");
            WriteLine($"PublicKey:{rsaKey.PublicKey}");
            ReadKey();
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace RSA_Demo
{
   public static class RsaUtil
    {
        //https://www.cnblogs.com/revealit/p/6094750.html
        const int DWKEYSIZE = 1024; 

        public static RSAKey GetRSAKey()
        {
            RSACryptoServiceProvider.UseMachineKeyStore = true;
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(DWKEYSIZE);
            RSAParameters paras = rsaProvider.ExportParameters(true);

            return new RSAKey()
            {
                PublicKey=ComponentKey(paras.Exponent,paras.Modulus),
                PrivateKey=ComponentKey(paras.D,paras.Modulus)
            };
        }

        private static string ComponentKey(byte[] b1, byte[] b2)
        {
            List<byte> list = new List<byte>();
            list.Add((byte)b1.Length);
            list.AddRange(b1);
            list.AddRange(b2);
            byte[] b = list.ToArray<byte>();

            return Convert.ToBase64String(b);
        }

        private static void ResolveKey(string key,out byte[] b1,out byte[] b2)
        {
            byte[] b = Convert.FromBase64String(key);

            int b1Length = b[0];
            b1 = new byte[b1Length];
            b2 = new byte[b.Length- b1Length - 1];

            for (int n=1,i = 0,j=0; n < b.Length; n++)
            {
                if (n<= b1Length)
                {
                    b1[i++] = b[n];
                }
                else
                {
                    b2[j++] = b[n];
                }
            }
        }

        public static string EncryptionString(string source, string key)
        {
            string encryptString = string.Empty;
            byte[] d;
            byte[] n;

            try
            {
                if (!CheckSourceValidate(source))
                {
                    throw new Exception("source string too long");
                    /*为何还有限制
                     * https://blog.csdn.net/taoxin52/article/details/53782470
                    *如果source过长可以将source分段加密 追加到StringBuilder中
                    *source差分的时候,建议已35个字符为一组
                    * RSA 一次加密的byte数量是有限制的
                    * 一般中文转换成3个或者4个byte
                    * 如果某个中文转换成3个byte 前两个byte 与后一个byte被差分到
                    * 两个段里加密,解密的时候就会出现乱码
                    * 另外在两个加密段之间添加特殊符合@解密的时候先用@差分
                    * 分段解密,在拼接成解密后的字符串
                    */
                }

                //解析这个密钥
                ResolveKey(key, out d, out n);
                BigInteger   biN = new BigInteger(n);
                BigInteger biD = new BigInteger(d);
                encryptString = EncryptionString(source,biD,biN);
            }
            catch (Exception)
            {
                encryptString = source;
            }

            return encryptString;
        }

        private static string EncryptionString(string source, BigInteger d, BigInteger n)
        {
            int len = source.Length;
            int len1 = 0;
            int blockLen = 0;

            if ((len%128)==0)
            {
                len1 = len / 128;
            }
            else
            {
                len1 = len / 128+1;
            }

            string block = "";
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < len1; i++)
            {
                if (len>=128)
                {
                    blockLen = 128;
                }
                else
                {
                    blockLen = len;
                }

                block = source.Substring(i * 128, blockLen);

                byte[] oText = System.Text.Encoding.UTF8.GetBytes(block);
                BigInteger biText = new BigInteger(oText);
                //BigInteger biEnText=biText.modPow()

            }

            return result.ToString().TrimEnd(@);
        }

        /// <summary>
        /// 检查明文的有效性 DWKEYSIZE/8-11 长度之内为有效 中英文都算一个字符
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        private static bool CheckSourceValidate(string source)
        {
            return (DWKEYSIZE / 8 - 11) >= source.Length;
        }
    }

    public struct RSAKey
    {
        public string PublicKey { get; set; }
        public string PrivateKey { get; set; }
    }
}

 

EncryptionAndDecryptionC# 加密 解密

标签:from   ida   bytes   rtp   name   too long   threading   oar   sub   

原文地址:https://www.cnblogs.com/Jeely/p/11721010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!