RSA加密算法验证(C#实现)
RSA算法简单原理介绍(节选于网络)
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
- 随意选择两个大的质数p和q,p不等于q,计算N=pq。
- 根据欧拉函数,求得r = (p-1)(q-1)
- 选择一个小于 r 的整数 e,求得 e 关于模 r 的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
- 将 p 和 q 的记录销毁。
(N,e)是公钥,(N,d)是私钥。Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。
加密消息
假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c:
ne ≡ c (mod N)
计算c并不复杂。Bob算出c后就可以将它传递给Alice。
解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n:
cd ≡ n (mod N)
得到n后,她可以将原来的信息m重新复原。
解码的原理是:
cd ≡ n e·d(mod N)
以及ed ≡ 1 (mod p-1)和ed ≡ 1 (mod q-1)。由费马小定理可证明(因为p和q是质数)
n e·d ≡ n (mod p) 和 n e·d ≡ n (mod q)
这说明(因为p和q是不同的质数,所以p和q互质)
n e·d ≡ n (mod pq)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace RSA
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} //****************************************
//验证输入的p,q是否为素数,并计算n与m
//****************************************
private void button1_Click(object sender, EventArgs e)
{
long p, q;
//获取p,q的值
p = long.Parse(textBox1.Text);
q = long.Parse(textBox2.Text); //判断p,q是否为素数,若为真进行计算,则否弹出提示
if (isPrim(p) && isPrim(q))
{
long n = p * q;
long m = (p - ) * (q - );
textBox3.Text = n.ToString();
textBox4.Text = m.ToString();
}
else
{
MessageBox.Show("请按要求,重新输入p,q");
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox1.Focus();
} } //****************************************
//用随机数生成素数pq,并计算n与m
//**************************************** private void button5_Click(object sender, EventArgs e)
{
//生成随机数工具
Random random = new Random();
long p, q; //设置判断标志
Boolean flag = false;
while (!flag)
{
p = random.Next();
q = random.Next(); //若生成的两个随机数都为素数,设定更新标志,并进行显示
if (isPrim(p) && isPrim(q))
{
flag = true;
textBox1.Text = p.ToString();
textBox2.Text = q.ToString();
textBox3.Clear();
textBox4.Clear();
} }
} //****************************************
//验证输入的d是否为素数, 并计算公钥d
//****************************************
private void button2_Click(object sender, EventArgs e)
{
//获取d,m的值
long d = long.Parse(textBox5.Text);
long m = long.Parse(textBox4.Text); //判断输入的d是否符合条件
if (d > && d < m && gcd(d, m) == && isPrim(d))
{
//使用逆元函数,计算d,m的逆元
long result = niyuan(d, m);
textBox6.Text = result.ToString();
}
else
{
MessageBox.Show("输入的 e 不符合要求,请按要求,重新输入公钥 e !");
textBox5.Clear();
textBox5.Focus(); }
} //****************************************
//随机生成私钥d,并计算出公钥e
//****************************************
private void button6_Click(object sender, EventArgs e)
{
long d = ; //获取m的值,用以计算e
long m = long.Parse(textBox4.Text); //生成随机数工具,并设置随机是否完成标志
Random radom = new Random();
Boolean flag = false;
while(!flag)
{
d = radom.Next();
if (d > && d < m && gcd(d, m) == && isPrim(d))
{
flag = true;
}
} //利用逆元函数计算公钥
long result = niyuan(d, m); textBox5.Text = d.ToString();
textBox6.Text = result.ToString(); } //****************************************
//利用公钥n和私钥e,加密明文
//****************************************
private void button4_Click(object sender, EventArgs e)
{
//设置标志,判断是否已经输入明文
Boolean flag = false;
if (!string.IsNullOrWhiteSpace(textBox7.Text))
flag = true; if(flag == false)
{
MessageBox.Show("加密前,请先输入明文!");
textBox7.Focus();
}
else
{
long n = long.Parse(textBox3.Text);
long m = long.Parse(textBox7.Text);
long E = long.Parse(textBox5.Text); //利用快速指数模运算函数生成密文
long C = getMod(E, m, n);
textBox8.Text = C.ToString();
} } //****************************************
//利用公钥n和公钥d,解密密文
//****************************************
private void button3_Click(object sender, EventArgs e)
{
//设置标志,判断是否已经输入密文
Boolean flag = false;
if (!string.IsNullOrWhiteSpace(textBox9.Text))
flag = true;
if(flag == false)
{
MessageBox.Show("解密前,请先输入密文!");
textBox9.Focus();
}
else
{
long C = long.Parse(textBox9.Text);
long n = long.Parse(textBox3.Text);
long d = long.Parse(textBox6.Text); //利用快速指数模运算函数解密密文
long M = getMod(d, C, n);
textBox10.Text = M.ToString();
} } //****************************************
//输入一个数,以6为步进单元判断其是否为素数
//****************************************
private bool isPrim(long num)
{
//两个较小数另外处理
if (num == || num == )
return true;
//不在6的倍数两侧的一定不是质数
if (num % != && num % != )
return false;
long tmp = (long)Math.Sqrt(num);
//在6的倍数两侧的也可能不是质数
for (long i = ; i <= tmp; i += )
if (num % i == || num % (i + ) == )
return false;
//排除所有,剩余的是质数
return true;
} //****************************************
//采用递归的形式,判断两个数是否互质
//****************************************
private long gcd(long x, long y)
{
return y != ? gcd(y, x % y) : x;
} //****************************************
//利用欧几里得算法计算m,d的逆元
//****************************************
private long niyuan(long number1, long number3)
{
long x1 = , x2 = , x3 = number3, y1 = , y2 = , y3 = number1;
long q;
long number4 = ;
long t1, t2, t3;
while (y3 != )
{
if (y3 == )
{
number4 = y2;
break;
}
else
{
q = (x3 / y3);
t1 = x1 - q * y1;
t2 = x2 - q * y2;
t3 = x3 - q * y3;
x1 = y1; x2 = y2; x3 = y3;
y1 = t1; y2 = t2; y3 = t3;
}
}
if (number4 < )
number4 = number4 + number3;
return number4;
} //****************************************
//利用快速指数模运算,计算m^e mod n
//****************************************
private long getMod(long a, long b, long c)
{
//指数 e --> a 底数 m --> b 模数 n --> c
long number3 = ;
while (a != )
{
if (a % == )
{
a = a - ;
number3 = (number3 * b) % c;
}
else
{
a = (a / );
b = (b * b) % c;
}
}
return number3; }
}
}
RSA加密算法验证(C#实现)的更多相关文章
- RSA加密算法的简单案例
RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. 那关于RSA加密算法有哪些应用呢?以下举一个数据库身份验证的案例. 在使用数据集进行身份认证时,密码存在数据 ...
- RSA加密算法原理及RES签名算法简介
第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...
- java与.net平台之间进行RSA加密验证
RSA加密算法虽然不分平台,标准都是一样的,但是各个平台的实现方式都不尽相同,下面来我来说说java与.net平台之间该如何进行RSA加密验证,即java端加密->.net端验证和.net端加密 ...
- RSA加密算法及其与SpringMVC集成
如有不足,敬请各位提出批评,定会改正.THX! 本文介绍的是RSA加密算法+Spring Security在SpringMVC中的集成使用. Spring Security是什么? 引用: Sprin ...
- C#基于RSA加密算法实现软件注册实战演练
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- Centos7安装Chacha20加密算法 (验证成功)
Centos7安装Chacha20加密算法 (验证成功) 有些程序会使用Chacha20加密算法,如果Centos7系统报错Exception: libsodium not found,则缺乏M2Cr ...
- RSA加密算法和签名算法
RSA加密算法 RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法). .密钥生成算法以安全常数作为输入,输出一个公钥PK,和一个 ...
- SpringMVC集成RSA加密算法
技术交流群: 233513714 本文介绍的是RSA加密算法+Spring Security在SpringMVC中的集成使用. Spring Security是什么? 引用: Spring Secur ...
- RSA加密算法原理及RES签名算法简介(转载)
第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...
随机推荐
- SoapUI简介和入门实例解析
SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Ecl ...
- 【转】开源中国上看到的一个vim的自动配置的好东西,分享下
https://www.oschina.net/p/onekey-to-vim-ide 变量有高亮,竖行上有直线定位,对python的支持效果更佳,从事C/C++开发的程序员使用也不错.
- 【京东账户】——Mysql/PHP/Ajax爬坑之添加购物车
一.引言 做京东账户项目中的购物车模块,功能之一就是添加购物车.要用到的是Apach环境,Mysql.PHP以及Ajax. 预计效果:用户点击->"加入购物车" 添加成功 ...
- Finally-操作返回值
Finally中操作返回会出现一个问题?直接看代码 static int M1() { ; try { result = result + ; //======引发异常的代码========== , ...
- 读Zepto源码之IOS3模块
IOS3 模块是针对 IOS 的兼容模块,实现了两个常用方法的兼容,这两个方法分别是 trim 和 reduce . 读 Zepto 源码系列文章已经放到了github上,欢迎star: readin ...
- 什么是PWM信号
PWM信号脉宽调制PWM是开关型稳压电源中的术语.这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM.PFM混合型.脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下, ...
- 【Spring】高级装配
前言 前面讲解了bean的核心装配技术,其可应付很多中装配情况,但Spring提供了高级装配技术,以此实现更为高级的bean装配功能. 高级装配 配置profile bean 将所有不同bean定义放 ...
- 【模版】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串在文本 ...
- 入门VMware Workstation下的Debian学习之基本命令(二)
本章记录如何在Linux终端进行命令操作命令下载路径,模拟终端.dkpg管理软件包.用户组和用户管理.文件属性.文件与目录管理.查看磁盘使用量. (1)命令下载路径: wegt 路径; (2)模拟终端 ...
- 【学习】js学习笔记:数组(一)
1.创建数组并赋值 //对象方式 var arr=new Array(1,2,3,4); //隐形声明方式 var arr2=[5,6,7,8]; 2.数组可以存储任何类型的数据 3.访问数组,是用下 ...