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;
}
}
}
来源: http://www.bubuko.com/infodetail-2273441.html