RSA加密解密总结
简单的控制台程序
#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;
}
RSA加密解密总结的更多相关文章
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- C# Java间进行RSA加密解密交互
原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...
- C# Java间进行RSA加密解密交互(二)
原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...
- C# Java间进行RSA加密解密交互(三)
原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...
- RSA加密解密及数字签名Java实现--转
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
- RSA加密解密和读取公钥、私钥
/// <summary> /// RSA加密解密及RSA签名和验证 /// </summary> public class RSADE { ...
随机推荐
- Nginx+tomcat+redis 集群session共享
插件资源下载地址:https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/tag/2.0.2 一.前置条件 J ...
- mysql 查询所有父级名称
SELECT T2.id, T2.name FROM ( SELECT @r AS _id, ,,@stop) as stop, (SELECT @r := p_id FROM goods_class ...
- Java 经典练习题_Day010
final 变量能被显式地初始化并且只能初始化一次.被声明为 final 的对象的引用不能指向不同的对象.但是 final 对象里的数据可以被改变.也就是说 final 对象的引用不能改变,但是里面的 ...
- Serv-u只开放21端口连接不上解决方案
在Serv-U的Local Server -> Settings -> Advanced -> PASV port range里, 填入给PASV模式使用的本地端口范围,如60000 ...
- Fiddler 抓包工具总结-bpafter
转摘https://www.cnblogs.com/shy1766IT/p/5199334.html Fiddler 抓包工具总结 名称 含义 # 抓取HTTP Request的顺序,从1开始,以 ...
- 利用spring的ApplicationListener实现springmvc容器的初始化加载
1.我们在使用springmvc进行配置的时候一般初始化都是在web.xml里面进行的,但是自己在使用的时候经常会测试一些数据,这样就只有加载spring-mvc.xml的配置文件来实现.为了更方便的 ...
- python + docker, 实现天气数据 从FTP获取以及持久化(四)-- 数据准备
前情提要 在之前的文章里,我们已经掌握从FTP上面下载天气数据然后插入到数据库中. 但是如何将我们已有的数据放到生产环境中呢? 思考 首先,我们先简单的理一理现在的情况. 目前: FTP上面已有半个月 ...
- 自己写了一个图片的马赛克消失效果(jQuery)
其中的一个效果: html代码: <h1>单击图片,产生效果</h1> <div class="box"></div> 插件代码: ...
- 使用Java配置SpringMVC
在此之前,一直使用的是XML的方式配置SpringMVC,现在为了适应Servlert3.0以及JavaConfig的Spring配置方式,在这里记录一下使用Java代码配置SpringMVC.首先, ...
- CSS控制文字只显示一行 超出部分显示省略号
<p style="width: 120px; height: 50px; border: 1px solid blue; white-space: nowrap; over ...