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 { ...
随机推荐
- Jython:java调用python文件之第三方包路径问题
本文转载自:http://blog.csdn.net/ztf312/article/details/51338060 本方法解决python代码的可移植性,不需要在新机器上配置python环境,只通过 ...
- ffmpeg+nginx+video实现rtsp流转hls流,通过H5查看监控视频
一.FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 下载并解压FFmpeg文件夹,配置环境变量:在“Path”变量原有变量值内容上加上d:\ffmpeg\bin, ...
- Java 运用流传输文件
实例1 package IO; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import ...
- 一、jdk工具之jps(JVM Process Status Tools)命令使用
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- 面试总结之数据结构(Data Structure)
常用数据结构及复杂度 http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find De ...
- php soap实例讲解
一,什么是soap,什么是wsdl,为什么要用他们 SOAP是基于XML和HTTP通信协议,xml各种平台,各种语言都支持的一个种语言.http呢它得到了所有的因特网浏览器及服务器的支持. WSDL ...
- JMS消息模型
消息机制: 系统之间通信的中介,作为一台单独的服务器部署,大多数使用多个系统之间协作,是系统解耦的常见解决方案. 基于CS架构 作用:多个系统之间解耦,项目可以分开开发,满足显示的高可用(也可以说是异 ...
- Putty使用密钥登陆SSH
平时工作学习必须要使用Windows,在SSH远程连接软件里Putty算是用得比较顺手的,而且很小巧. 但是每次输入密码很麻烦,还容易输错,OpenSSH可以利用密钥来自动登陆,如此一来方便了不少.配 ...
- 4_bootstrap之栅格系统
4.栅格系统 4.1.简述栅格系统 为了方便在布局容器中进行网页的布局操作. BootStrap提供了一套专门用于响应式开发布局的栅格系统. 栅格系统将一行分为12列,通过设定元素占用的列数来 布局元 ...
- OpenMP 简单的规约
▶ 简单的计算和规约 ● 第一种方法,将全局和的指针传入工作函数中进行加和,使用 critical 来控制临界区的访问 #include <stdio.h> #include <st ...