标签: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; } } }
标签:console dom ica 约数 view return random als except
原文地址:http://www.cnblogs.com/lhking/p/7412284.html