RSA.h
#ifndef _RSA_H
#define _RSA_H
#include<stdio.h>
#include<iostream>
#include<math.h>
/*
密钥产生:
1.随机选定两个大素数p, q.
2.计算公钥和私钥的公共模数 n = pq .
3.计算模数n的欧拉函数 φ(n) .
4.选定一个正整数e, 使1 < e < φ(n) , 且e与φ(n)互质.
5.计算d, 满足 de ≡ 1 (mod φ(n) ), (k为某个正整数).
6.n与e决定公钥, n与d决定私钥.
*/
/*
加密:C=M^e mod n
*/
/*
解密:C=M^d mod n
*/
//#define RAND_MAX_64 9223372036854775807//最大素数2^63-1
//#define RAND_MIN_64 2147483647//最小素数2^31-1
#define RAND_MAX_64 1000000
#define RAND_MIN_64 1000
#define Max_64 9223372036854775807
#define Times 10//测试素数次数 class RSA
{
public:
RSA();
~RSA(void);
void encryption(__int64 *M,__int64 *C);
void decryption(__int64 *C,__int64 *M);
void getKey();//生成密钥
__int64 get_p(){return p;};
__int64 get_q(){return q;};
__int64 get_n(){return n;};
__int64 get_o(){return o;};
__int64 get_e(){return e;};
__int64 get_d(){return d;};
private:
__int64 Sqrt(__int64 num); //大数开平方根
__int64 get_Prime(); //得到大素数
__int64 mod(__int64 a,__int64 m,__int64 n);//快速求模
__int64 Euclid(__int64 a,__int64 b); //欧几里德算法
bool Prime_test(__int64 n); //确定性测试
bool Witness(__int64 a,__int64 n); //概率测试
bool Extended_Euclid(__int64 a,__int64 n,__int64 *d); //扩展的欧几里德算法
//公钥KU={e,n}
//私钥KR={d,p,q}/{d,n}
__int64 p;//素数p
__int64 q;//素数q
__int64 n;//n=p*q
__int64 o;//φ(n)=(p-1)(q-1)
__int64 e;//随机整数
__int64 d;//d=e^-1
};
#endif
RSA.cpp
#include"RSA.h"
//构造函数
RSA::~RSA(){};
//析构函数
RSA::RSA(){};
//加密
void RSA::encryption(__int64 *M,__int64 *C){
*C=RSA::mod(*M,this->e,this->n);
}
//解密
void RSA::decryption(__int64 *C,__int64 *M){
*M=RSA::mod(*C,this->d,this->n);
}
//快速求模
//d=a^m mod n b[k]=m=(101010010)
__int64 RSA::mod(__int64 a,__int64 m,__int64 n){
__int64 b[],k=,i;
__int64 c, d;
for(;m!=;m>>=){
if(m%==)
b[k]=;
else
b[k]=;
k++;
}
c=;
d=;
for(i=k;i>=;i--){
c=*c;
d=(d*d)%n;
if(b[i]==){
c=c+;
d=(d*a)%n;
}
//printf("%lld ",c);
//printf("%lld\n",d);
}
return d;
}
//确定性测试
//n素数
bool RSA::Prime_test(__int64 n){
__int64 r=;
while(r<Sqrt(n)){
if(n%r==)
return false;
r=r+;
}
return true;
}
//概率测试
//n为素数,a<n
bool RSA::Witness(__int64 a,__int64 n){
__int64 m=n-;
__int64 b[],k=,i;
__int64 d,x;
for(;m!=;m>>=){
if(m%==)
b[k]=;
else
b[k]=;
k++;
}
d=;
for(i=k;i>=;i--){
x=d;
d=(d*d)%n;
if(d==&&x!=&&x!=n-)
return true;//合数
if(b[i]==)
d=(d*a)%n;
}
if(d!=)
return true;//合数
return false;//可能是素数
}
//欧几里德算法
__int64 RSA::Euclid(__int64 a,__int64 b){
__int64 x=b,y=a,r=;
if(y>){
r=x%y;
x=y;
y=r;
}
return x;
}
//扩展的欧几里德算法
//d=e^-1 mod n
bool RSA::Extended_Euclid(__int64 a,__int64 n,__int64 *d){
__int64 x1=,x2=,x3;
__int64 y1=,y2=,y3;
__int64 t1,t2,t3,q;
x3=(n>=a)?n:a;//大的数
y3=(n>=a)?a:n;//小的数
while(){
if(y3==){
*d=x3;
return false;
}
if(y3==){
*d=y2;
return true;
}
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;
}
}
//得到大素数
__int64 RSA::get_Prime(){
int flag=; //
int times=;//测试素数次数
__int64 a,n=;
while(flag==){
//步骤1
step_1:flag=;
n = (__int64)(rand()%(RAND_MAX_64 - RAND_MIN_64+))+RAND_MIN_64;
n=(n/)*+;
printf("%lld%\r",n);
//步骤2
if(Prime_test(n)==false){
//返回步骤1
goto step_1;
}
else{
//步骤3
step_3:a = (__int64)(rand()%(n--+))+;//0<a<n
//步骤4
if(Witness(a,n)==true){
//返回步骤1
goto step_1;
}
else{
times++;
if(times>=Times){
flag=;
return n;
}
else{
//返回步骤3
goto step_3;
}
}
}
}
return ;
}
//密钥的生成
void RSA::getKey(){
this->p = get_Prime();
this->q = get_Prime();
this->n = this->p*this->q;//n=p*q
this->o = (this->p-)*(this->q-);//φ(n)=(p-1)(q-1)
do{
this->e = (__int64)(rand()%(this->o+));//0<e<φ(n)
}while(==Euclid(this->e,this->o));//e与φ(n)互质
//this->e = 3;
if(true==Extended_Euclid(this->e,this->o,&(this->d))){
while(this->d<=Sqrt(Sqrt(this->n))){
Extended_Euclid(this->e,this->o,&(this->d));
}
printf("密钥生成成功:%lld\n",this->d);
}
else{
RSA::getKey();
}
}
//大数开根
__int64 RSA::Sqrt(__int64 num){
__int64 low ,mid ,up;
low = ,up = num;
if(up > Max_64) up = Max_64;
__int64 mk = ;
while(low <= up){
mid = (low + up) / ;
if(mid * mid > num){
up = mid - ;
}
else{
low = mid + ;
mk = mid;
}
}
return mk;
}
TEST.cpp
#include"RSA.h"
#include<stdio.h> int main(){
__int64 M=,C=;
RSA rsa = RSA();
printf("----------生成密钥----------\n");
rsa.getKey();
printf("----------输出密钥----------\n");
printf("p:%lld\n",rsa.get_p());
printf("q:%lld\n",rsa.get_q());
printf("n:%lld\n",rsa.get_n());
printf("o:%lld\n",rsa.get_o());
printf("e:%lld\n",rsa.get_e());
printf("d:%lld\n",rsa.get_d());
printf("----------加密信息----------\n");
printf("请输入明文:\n");
scanf("%lld",&M);
rsa.encryption(&M,&C);
printf("加密后密文:%lld\n",C);
printf("----------解密信息----------\n");
printf("请输入密文:\n");
scanf("%lld",&C);
rsa.decryption(&C,&M);
printf("解密后明文:%lld\n",M); system("pause");
return ;
}

RSA算法的更多相关文章

  1. 信息安全-5:RSA算法详解(已编程实现)[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...

  2. RSA算法原理

    一直以来对linux中的ssh认证.SSL.TLS这些安全认证似懂非懂的.看到阮一峰博客中对RSA算法的原理做了非常详细的解释,看完之后茅塞顿开,关于RSA的相关文章如下 RSA算法原理(一) RSA ...

  3. C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用

    .net中,处于安全的考虑,RSACryptoServiceProvider类,解密时只有同时拥有公钥和私钥才可以.原因是公钥是公开的,会被多人持有.这样的数据传输是不安全的.C#RSA私钥加密,公钥 ...

  4. [已解决] 快速理解RSA算法

    RSA算法基础详解 http://www.cnblogs.com/hykun/p/RSA.html RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/ ...

  5. 公钥私钥和RSA算法

    1, RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2, RSA算法原理(二) http: ...

  6. 跨越千年的RSA算法

    转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  7. (转)RSA算法原理(二)

      作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...

  8. (转) RSA算法原理(一)

    最近用到了RSA加密算法,虽然有现成的,但是想看看它的原理,翻到此文,感觉写得很好,通俗易懂,转了.   作者: 阮一峰 日期: 2013年6月27日 如果你问我,哪一种算法最重要? 我可能会回答&q ...

  9. springmvc使用RSA算法加密表单

    今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以 ...

  10. RSA算法基础详解

    . 首页 博客园 联系我 前言:在RSA诞生之前. RSA算法. 质数与互质数. 模运算. 同余. 欧拉函数. 欧拉定理与模反元素. 真实的例子. 计算密钥. 密钥组成与加解密公式. 安全性. 一点感 ...

随机推荐

  1. C# 在腾讯的发展

    本文首发我的微信公众号"dotnet跨平台", 内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处. .NET 主要的开发语言是 C# , .NET 平台泛指遵循EC ...

  2. CSS十问——好奇心+刨根问底=CSSer

    最近有时间,想把酝酿的几篇博客都写出来,今天前端小学生带着10个问题,跟大家分享一下学习CSS的一些体会,我觉得想学好CSS,必须保持一颗好奇心和刨根问底的劲头,而不是复制粘贴,得过且过.本人能力有限 ...

  3. wordpress多站点配置

    wordpress作为全球第一的个人博客搭建平台一直在国内外有着较高的人气,从3.0版本开始就已经支持多站点的搭建.该功能可以让子站点运行主站点的程序,不需要再每个站点分别存放网站程序.最近更新的4. ...

  4. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  5. iOS有关横向TableView的东西

    之前看到Apple store里面有横向的tableview,当然也有可能是collectionview啦. 尤其是项目中只有一条那么需要横向滑动的东西,就没有必要使用庞大的collectionvie ...

  6. 解决VS2008在win7找不到输入序列号的地方

    1.VS2008在Windows7 打开维护界面看不到可以输序列号的地方. 因为微软把他隐藏了. 2.我们可以借用工具把他显示出来 下载地址:http://www.zlsoft.com/techbbs ...

  7. 使用HttpClient的优解

    新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工作流畅地看了一遍,接下来就是熟悉框架技术的阶段了. 也正是在看源码的过程当中,有一 ...

  8. 著名ERP厂商的SSO单点登录解决方案介绍一

          SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...

  9. 玩转ajax

    1.什么是ajax? Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应 ...

  10. XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

    SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 可以很容易的构建基于 ASP.NET 的实时 Web 应用.SignalR 支持多种服务器和客户端,可以 Host ...