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 { ...
随机推荐
- 1.Appium环境搭建
1.安装node.js (1)去node官网下载,根据操作系统的不同选择不同对应的版本(https://nodejs.org/en/download/) (2)下载对应的版本后进行安装,一直下一步直至 ...
- ssh登录很慢的问题
1.关闭ssh DNS反向解析 vi /etc/ssh/sshd_config 修改UseDNS no 2.关闭 GSSAPI 的用户认证 vi /etc/ssh/sshd_config 修改GS ...
- Ubuntu 中安装 Docker
检查 Device Mapper 是否存在 sch01ar@ubuntu:~$ ls -l /sys/class/misc/device-mapper 安装 Ubuntu 维护的版本 sch01ar@ ...
- 使用jenkins SVN MSBuil配置.net mvc网站进行持续集成
通过多次搭建Jenkins持续构建环境,终于对Jenkins有了进一步认识,在此把所学所得和大家分享一下,希望可以帮助大家快速掌握Jenkins的核心思想.看了很多文章,最终决定使用Jenkins.以 ...
- Python-第三方库requests
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得 ...
- js中的event
event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定的事件有意义.比如,fromElement ...
- shell脚本实现tomcat进程—查、杀、启
#!/bin/bash#获取XXX项目进程IDXXXpid=`ps -ef | grep XXX | grep -v grep | awk '{print $2}'` echo "XXX项目 ...
- leetcode917
class Solution { public: string reverseOnlyLetters(string S) { int len = S.length(); queue<char&g ...
- ansible 使用
批量添加ssh免密 ansible mhc -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_dsa. ...
- [Android开源项目] GitHub开源项目总结 (转)
[Android开源项目] GitHub开源项目总结 GitHub开源项目android-styled-dialogs http://neast.cn/forum.php?mod=viewthread ...