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 { ...
随机推荐
- myeclipse越来越卡了怎么回事啊?
去掉拼写检查:windows->preferences->General->Editors->Text Editors->Spelling 将“Enable spell ...
- Android Studio中 ADB WIFI插件进行无线调试实践
首先要确保电脑和手机在同一个局域网中.具体步骤如下 1.Android Studio中安装ADB WIFI插件.安装成功后重启Android Studio.(没有安装过插件的同仁,请自己搜索) 2.手 ...
- emacs之配置代码风格
emacsConfig/code-style-setting.el (add-hook 'c-mode-common-hook ( lambda() ( c-set-style "java& ...
- bzoj1067 降雨量
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003, ...
- sqlnet.ora限制客户端IP访问
实现功能: 只允许某几个IP访问数据库服务端(白名单): $ORACLE_HOME/network/admin/sqlnet.ora 添加2个主要参数 TCP.VALIDNODE_CHECKING=y ...
- 2018 Multi-University Training Contest 4-Problem B. Harvest of Apples
由公式$S(n, m)=S(n - 1, m) + S(n - 1, m - 1) = 2 * S(n - 1, m) - C_{n-1}^{m}$ 莫队思想
- jdbc练习demo
//连接云端服务器数据库工具类 public class TestJDBCUtil { public static String driver="com.mysql.jdbc.Driver& ...
- jquery使用js的一些疼处
使用javascript的一些疼处 书写繁琐,代码量大 代码复杂 动画效果,很难实现.使用定时器 各种操作和处理 HTML <button id="btn">按钮< ...
- Getting Started(入门)
欢迎阅读专门针对android开发者的培训课程,在这一系列的课程中,描述了如何通过我们的示例代码来完成特定的任务和功能,这些代码可以灵活地应用到你的应用程序中. 课程被分成了几部分, 第一部分,入门, ...
- 5_python之路之员工管理系统
python之路之员工管理系统 1.程序说明:Readme.cmd 1.程序文件:info_management.py user_info 2.程序文件说明:info_management.py-主程 ...