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

RSA 在C#里简单实现

时间:2017-08-22 16:50:20      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:console   dom   ica   约数   view   return   random   als   except   

    假设Alice想要通过一个不可靠的网络接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
1.随意选择两个大的质数p和q,p不等于q,计算n=pq。
2.根据欧拉函数,求得r = (p-1)(q-1)
3.选择一个小于 r 的整数 e1,求得 e1 关于模 r 的模反元素,命名为e2。(模反元素存在,当且仅当e1与r互质)
4.将 p 和 q 的记录销毁。
(n,e1)是公钥,(n,e2)是私钥。Alice将她的公钥(n,e1)传给Bob,而将她的私钥(n,e2)藏起来。

技术分享
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int p = 3;              //质数
            int q = 17;             //质数

            if (!IsSuShu(p) || !IsSuShu(q))
            {
                Console.WriteLine("选择的数字必须是素数");
            }

            int n = p * q;
            int r = (p - 1) * (q - 1); //欧拉函数

            var keyList = GetKeyList(r);
            var key = keyList.Where(k => k.Item1 != p && k.Item1 != q && k.Item2 != p && k.Item2 != q).LastOrDefault();
            int e1 = key.Item1;  //公钥
            int e2 = key.Item2;  //私钥

            long msg = 11;// new Random().Next(1, n); //msg必须小于n
            double encodeMsg = RSA(n, e1, msg);
            double decodeMsg = RSA(n, e2, encodeMsg);
            Console.WriteLine("加密前:" + msg);
            Console.WriteLine("加密后:" + encodeMsg);
            Console.WriteLine("解密后:" + decodeMsg);
            Console.Read();
        }

        private static List<Tuple<int, int>> GetKeyList(int r)
        {
            var list = new List<Tuple<int, int>>();
            int e1 = r;
            int e2 = 0;
            while (true)
            {
                if (e1 <= 1)
                {
                    break;
                }
                if (IsSuShu(e1))
                {
                    if (!IsHaveGongYueShu(r, e1)) //r与e1互质
                    {
                        e2 = GetE2(r, e1);
                        if (e2 > 0)
                        {
                            list.Add(new Tuple<int, int>(e1, e2));
                        }
                    }
                }
                e1--;
            }
            if (list.Count == 0)
            {
                throw new Exception("找不到合适的数字用来当做公钥");
            }
            return list;
        }

        private static int GetE2(int r, int e1)
        {
            for (int e2 = r; e2 > 0; e2--)
            {
                if ((e2 * e1) % r == 1 && e2 != e1) //求e1关于r的模反元素
                {
                    return e2;
                }
            }
            return 0;
        }

        private static bool IsHaveGongYueShu(int r, int e1)
        {
            var rList = new List<int>();
            var e1List = new List<int>();
            for (int i = 2; i < r; i++)
            {
                if (r % i == 0)
                {
                    rList.Add(i);
                }
            }
            for (int i = 2; i < e1; i++)
            {
                if (e1 % i == 0)
                {
                    e1List.Add(i);
                }
            }
            int result = rList.Where(p => e1List.Contains(p)).Count();
            if (result > 0) //两个数字是否有公约数
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private static bool IsSuShu(int num)
        {
            bool bl = true;
            for (int i = 2; i <= Math.Sqrt(num) && bl == true; i++) //数字是否是素数
            {
                if (num % i == 0)
                {
                    bl = false;
                }
            }
            return bl;
        }


        public static double RSA(int n, int key, double message)
        {
            if (n < 1 || key < 1)
            {
                return 0;
            }
            double rsaMessage = 0L;
            rsaMessage = Math.Pow(message, key) % n;
            return rsaMessage;
        }
    }
}
View Code

 

RSA 在C#里简单实现

标签:console   dom   ica   约数   view   return   random   als   except   

原文地址:http://www.cnblogs.com/lhking/p/7412284.html

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