简单的控制台程序 

#include"stdafx.h"
#include <math.h>
#include<string.h>
/*/求解密密钥d的函数(根据Euclid算法)96403770511368768000*/
unsigned long rsa(unsigned long p, unsigned long q, unsigned long e) /*/求解密密钥d的函数(根据Euclid算法)*/
{
unsigned long g, k, r, n1, n2, t;
unsigned long b1 = 0, b2 = 1;
g = (p - 1)*(q - 1);
n1 = g;
n2 = e;
while (1)
{
k = n1 / n2;
r = n1 - k*n2;
if (r != 0)
{
n1 = n2;
n2 = r;
t = b2;
b2 = b1 - k*b2;
b1 = t;
}
else
{
break;
}
}
return (g + b2) % g;
}
/*/判断一个数是否为素数*/
bool is_prime(int p) {
int end = sqrt(p);
for (int i = 2; i <= end; i++)
if (p%i == 0)
return false;
return true;
}
/*/利用利用倍增法实现x^p mod m */
long long expmod(int x, int p, int m) {
//x^p mod m
const int N = 110;
int a[N];
long long s;
//scanf("%d%d%d", &x, &p, &m);
//将p转成二进制传入a数组
int k = 0;
while (p>0) {
++k;
a[k] = p % 2;
p = p / 2;
} //for (int i = k; i>0; --i) printf("%d", a[i]);
//printf("\n"); //初始化连续变量t和答案s
long long t = x;
if (a[1] == 0) s = 1;
else s = x; //倍增
for (int i = 2; i <= k; ++i) {
t = t*t%m;
if (a[i] == 1) s = s*t%m;
}
//printf("%I64d", s);
return s;
}
int main() {
int p, q, e;//素数p,q和随机数e
printf("welcom come to the ESA program\n");
printf("please input two prime unsigned number p,q and a rand unsigned number e\n");
printf(" p="); scanf("%d", &p);
printf(" q="); scanf("%d", &q);
printf(" e="); scanf("%d", &e);
bool bp=false, bq=false;
while (bp == false || bq == false) {
if (p*q < 127||p<0||q<0) {
if(p>0&&q>0)printf("please input two more big prime unsigned number p,q\n");
else if (p<0 || q<0)printf("please input two prime unsigned number p,q(p>1,q>1)\n");
printf(" p="); scanf("%d", &p);
printf(" q="); scanf("%d", &q);
bp = bq = false;
}
else {
bp = is_prime(p);
if (p <= 1)
bp = false;
bq = is_prime(q);
if (q <= 1)
bq = false;
if (bp == false)
{
if (p == 1)
printf("input a more big prime number p=");
else
printf("input a prime unsigned number p=");
scanf("%ud", &p); printf("\n");
}
if (bq == false) {
if (q == 1)
printf("input a more big prime number q=");
else
printf("input a prime unsigned number q=");
scanf("%ud", &q); printf("\n");
}
}
}
//计算公钥与私钥
int n = p*q;
int fn = (p - 1)*(q - 1);
int d = rsa(p, q, e);
printf("公钥:(e,n)为(%d,%d)\n",e,n);
printf("私钥:(d,n)为(%d,%d)\n",d,n);
printf("---------加密/解密---------\n");
char ch = 'a';
while (ch != 'd' && ch != 'D' && ch != 'e' && ch != 'E') {
printf("加密输入e或E,解密输入d或D,请选择:\n");
getchar();
scanf("%c",&ch);
}
char* str = new char[1024];
int i, len;
//encryption加密
if (ch == 'e' || ch == 'E') {
printf("---------加密--------\n");
printf("please input what you want to encryption(String):\n");
scanf("%s", str);
i = 0, len = strlen(str);
int mingwen;
while (i < 1024 && i < len) {
mingwen = (int)str[i];
int pr = expmod(mingwen, e, n);
if (i != 0)
printf(",");
printf("%d", pr);
i++;
}
printf("\n");
}
//decryption解密
else if (ch == 'd' || ch == 'D') {
printf("---------解密--------\n");
printf("please input what you want to decryption(String)\n");
printf("you should input just as XXX,XXX,XXX,XXX,XXX\n");
scanf("%s", str);
i = 0, len = strlen(str);
long long im = 0;
while (i < 1024 && i < len) {
if (str[i] != ',')
im = im * 10 + (int)str[i] - 48;
else {
im = expmod(im, d, n);
printf("%c", (char)im);
im = 0;
}
if (i == 1023 || i == len - 1) {
im = expmod(im, d, n);
printf("%c", (char)im);
im = 0;
}
i++;
}
printf("\n");
}
getchar();
getchar();
return 0;
}

  

 

最新文章

  1. POJ 1681 Painter&#39;s Problem (高斯消元)
  2. jQuery 操作html元素
  3. 经典SQL语句大全(网络资源共享)
  4. 用R分析时间序列(time series)数据
  5. CoffeeScript学习(1)——Quick Start
  6. 能用存储过程的DBHelper类
  7. Scrapy的shell命令(转)
  8. Hacker(18)----了解Windows系统漏洞
  9. js数组对象常用方法小结
  10. JAVA刚碰见的问题( java.lang.SecurityException: The jurisdiction policy files are not signed by a trusted signer)
  11. HTTPS=HTTP + SSL / TLS
  12. vi光标移动
  13. python3 十六进制字符串进行分割并累加
  14. mysql 连接 的drive 不一样
  15. Redux学习(3) ----- 结合React使用
  16. BZOJ2872 : 优莱卡
  17. LNMP安装目录及配置文件
  18. JVM——Java虚拟机架构
  19. JMeter学习(十四)JMeter函数学习(转载)
  20. 各小组Alpha版项目发布作品点评

热门文章

  1. 推荐一个React 入门的教程
  2. [C++ Primer] 第7章: 类
  3. unity的prefab(预设)例子
  4. debian的甘特图工具
  5. bzo j4825 [Hnoi2017]单旋
  6. Regenerate Script 重置脚本
  7. jvectormap地图开发和制作任意国家地图
  8. win10初期版本administrator的限制
  9. 使用GridFsTemplate在Mongo中存取文件
  10. j2ee常用jar包