C++实现RSA加密解密
来源:互联网 发布:2017软件测评师真题 编辑:程序博客网 时间:2024/05/17 03:06
RSA算法的描述
1、选取长度相等的两个大素数p和q,计算其乘积:
n = pq
然后随机选取加密密钥e,使e和(p–1)(q–1)互素。
最后用欧几里德扩展算法计算解密密钥d,以满足
ed = 1(mod(p–1) ( q–1))即d = e–1 mod((p–1)(q–1))
e和n是公钥,d是私钥
2、加密公式如下:
ci = mi^e(mod n)
3、解密时,取每一密文分组ci并计算:
mi = ci^d(mod n) Ci^d =(mi^e)^d = mi^(ed) = mi^[k(p–1)(q–1)+1 ] = mi mi^[k(p–1)(q–1)] = mi *1 = mi
4、消息也可以用d加密用e解密
#include <iostream>#include <stdio.h>#define p 43#define q 59#define e 13int candp(int a,int b,int c); //数据处理函数,实现幂的取余运算int fun(int x,int y); //公钥e与t的互素判断int main(){ int d,m,n,t,c,r; int m_t = 0; int m_i; int m_j; int ciphertext[100]; //存放密文的数组 int proclaimedtext[100]; //存放明文的数组 n=p*q; t=(p-1)*(q-1); //求n的欧拉数 d = 1; while(((e * d) % t) != 1) { d++; //由公钥e求出私钥d } while(1) { printf("加密请输入 1 解密请输入 2\n"); //加密或解密选择 scanf("%d",&r); switch(r) { case 1: printf("请输入密文 m: "); scanf("%d",&m); m_i = 0; while(m / 100) { m_t = m % 100; ciphertext[m_i] = m_t; proclaimedtext[m_i] = candp(m_t,e,n); m /= 100; m_i++; } ciphertext[m_i] = m; proclaimedtext[m_i] = candp(m,e,n); printf("明文为:\n"); for(int i = 0 ; i <= m_i ;i++) { printf("%d ",proclaimedtext[i]); } printf("\n"); break; case 2: printf("明文为 c: "); for(int i = 0 ; i <= m_i ;i++) { printf("%d ",proclaimedtext[i]); } printf("\n"); m_j = 0; while(m_i--) { ciphertext[m_j] = candp(proclaimedtext[m_j],d,n); m_j++; } printf("密文为:\n"); for(int i = m_j ; i >= 0 ;i--) { printf("%d",ciphertext[i]); } printf("\n"); break; } }}int candp(int a,int b,int c) //数据处理函数,实现幂的取余运算{ int r=1; b=b+1; while(b!=1) { r=r*a; r=r%c; b--; } return r;}int fun(int x,int y) //公钥e与t的互素判断{int t; while(y) { t=x; x=y; y=t%y; }if(x == 1)return 0; //x与y互素时返回0elsereturn 1; //x与y不互素时返回1}
测试俩组数据
第一组,密文为123456789,得出的明文485 2044 1570 2475 1
通过明文485 2044 1570 2475 1得出密文为123456789
第二组,密文为987456123,得出的明文41 1438 1570 560 1864
通过明文41 1438 1570 560 1864 得出密文为987456123
图片参考:
总结:
加密算法通常分为对称性加密算法和非对称性加密算法:
对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。
非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA可以实现的功能:
1.机密性:通讯报文采用rsa算法加密,不可读,加密的消息只要收方能够解密
2.防篡改:收方验证消息签名,能够发先任何更改
3.防抵赖:收方收到到的消息签名由发方的私钥运算生成,其他人无法生成对应信息
4.身份认证:收方能够解密信息,发方默认收方身份合法
RSA数字签名机制:用私钥进行签名,用公钥进行验签。认为私钥只有可信任对方一家有,所以保证身份认证和防止抵赖。
RSA加密解密机制:用公钥进行加密,用私钥进行解密。认为只有我的私钥可以解密,所以保证数据机密性不被别人偷窥、篡改。
- c#实现RSA加密解密
- java RSA加密解密实现
- java RSA加密解密实现
- C#实现RSA加密解密
- java RSA加密解密实现
- RSA加密解密JAVA实现
- java RSA加密解密实现
- java RSA加密解密实现
- Android RSA加密解密实现
- java RSA加密解密实现
- JAVA实现RSA加密解密
- java RSA加密解密实现
- RSA加密和解密实现
- java RSA加密解密实现
- RSA加密解密java实现
- RSA加密解密实现详情
- JAVA实现RSA加密解密
- java RSA加密解密实现
- Bayes 分类算法
- Python学习06-文件I/O
- 带你领略Linux系统发展及版本更迭
- JavaScript循环刷新页面
- 【bzoj3132】上帝造题的七分钟
- C++实现RSA加密解密
- css属性总结(一)
- Java代理模式简单整理
- Homing 使用初始值
- 新兴机器学习算法:从无监督降维到监督降维
- Android 优秀的第三方UI库集锦
- 对面向对象设计的理解—Java接口和Java抽象类
- c++ web framework
- 诤言只能对诤友《基层风云·1》·一