1.RSA算法简单介绍
2.快速指数算法
在RSA中,加、解密过程都是要求某个整数的整数次幂后再取模。大多时候,这两个整数都会比较大,这时候直接按含义来进行计算时得到的中间结果会超出计算机所允许的整数取值范围(例如计算66^77,这还是比较小的)
所以需要一种算法较快地计算 a^k (mod n)
1、将k二进制展开
2、制表
3、乘积
证明
C#代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RSA简单实现
{
class Program
{
//快速指数算法
//计算number1^number2 (mod number3)
static int hjy_speed(int number1,int number2,int number3)
{
int b = 1;
while(number2>0)
{
int a = number2 % 2;
if(a == 1)
{
b = (number1 * b) % number3;
}
number1 = (number1 * number1) % number3;
number2 = number2 / 2;
}
return b ;
}
static void Main(string[] args)
{
Console.Write("请输入要加密的字符串:");
string attr = Console.ReadLine();
Console.Write("请输入素数p:");
int p = int.Parse ( Console.ReadLine());
Console.Write("请输入素数q:");
int q = int.Parse(Console.ReadLine());
Console.Write("请输入e(e满足1<e<&(n)):");
int e = int.Parse (Console.ReadLine());
int n = q * p;
int Eular = (q - 1) * (p - 1);
int d;
// 已知公钥为(e,n),求私钥
int si = 1;
while(si*e%Eular!=1)
{
si++;
}
d = si;
//加密过程
Console.Write("加密后的字符串为:");
string m = "";
for (int i=0;i<attr.Length;i++)
{
int num = Convert.ToInt32(attr[i]);
m = m + Convert.ToChar(hjy_speed(num, e, n));
Console.Write( Convert.ToChar(hjy_speed(num, e, n)));
}
Console.WriteLine();
//解密过程
Console.Write("解密后的字符串为:");
for (int i = 0; i < m.Length; i++)
{
int num1 = Convert.ToInt32(m[i]);
Console.Write(Convert.ToChar(hjy_speed(num1, d, n)));
}
Console.WriteLine();
Console.ReadKey();
}
}
}