4个回答
展开全部
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#define gcc 10007
#define MAX ((INT)1<<63)-1
using namespace std;
typedef unsigned long long INT;
INT p[10]={2,3,5,7,11,13,17,19,23,29};
inline INT gcd(INT a,INT b)
{
INT m=1;
if(!b) return a;
while(m)
{
m=a%b;
a=b;
b=m;
}
return a;
}
//计算a*b%n
inline INT multi_mod(INT a,INT b,INT mod)
{
INT sum=0;
while(b)
{
if(b&1) sum=(sum+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return sum;
}
//计算a^b%n;
inline INT quickmod(INT a,INT b,INT mod)
{
INT sum=1;
while(b)
{
if(b&1) sum=multi_mod(sum,a,mod);
a=multi_mod(a,a,mod);
b>>=1;
}
return sum;
}
bool miller_rabin(INT n)
{
INT i,j,k=0;
INT u,m,buf;
//将n分解为m*2^k
if(n==2)
return true;
if(n<2||!(n&1))
return false;
m=n-1;
while(!(m&1))
k++,m>>=1;
for(i=0;i<9;i++)
{
if(p[i]>=n)
return true;
u=quickmod(p[i],m,n);
if(u==1)
continue;
for(j=0;j<k;j++)
{
buf=multi_mod(u,u,n);
if(buf==1&&u!=1&&u!=n-1)
return false;
u=buf;
}
//如果p[i]^(n-1)%n!=1那么n为合数
if(u-1)
return false;
}
return true;
}
INT extended_euclidean(INT n, INT m, INT &x, INT &y) {
if (m == 0) {
x = 1; y = 0; return n;
}
INT g = extended_euclidean(m, n % m, x, y);
INT t = x - n / m * y;
x = y;
y = t;
return g;
}
INT invmod(INT a,INT n)//求a对n的乘法逆元
{
INT x,y;
if(extended_euclidean(a,n,x,y)!=1) return -1;
return (x%n+n)%n;
}
void fff(char *str,INT *x){
INT t=0;
INT i,j=0;
for(i=0;i<strlen(str);i++){
t=t*10+str[i]-'0';
if(i%2==1){
x[j]=t;
j++;
t=0;
}
}
if(i%2) x[j]=t;
}
void rsa(INT *m,INT e,INT n){
for(INT i=0;i<100;i++)
m[i]=quickmod(m[i],e,n);
}
INT ranprim(){
INT p=0;
while(1){
p=(rand()%1000)+1000;
if(miller_rabin(p))
return p;
}
}
int main(){
srand((unsigned)time(NULL));
INT p,q,e,n,d,x;
do{
p=ranprim();
q=ranprim();
e=ranprim();
n=p*q;
d=invmod(e,(p-1)*(q-1));
x=(e*d)%((p-1)*(q-1));
}while(x!=1);
cout<<"p:"<<p<<" q:"<<q<<" e:"<<e<<" d:"<<d<<" n:"<<n<<endl;
char str[100];
int t;
INT m[100];
memset(m,0,sizeof(m));
while(scanf("%s",str)!=EOF){
t=(strlen(str)+1)/2;
fff(str,m);
rsa(m,e,n);
for(int i=0;i<t;i++)
printf("%d ",m[i]);
printf("\n");
rsa(m,d,n);
for(int i=0;i<t;i++)
printf("%d ",m[i]);
printf("\n");
}
}
我昨天刚给老师查的,没问题。输入数字,对数字加密。加密过程是两位一组。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#define gcc 10007
#define MAX ((INT)1<<63)-1
using namespace std;
typedef unsigned long long INT;
INT p[10]={2,3,5,7,11,13,17,19,23,29};
inline INT gcd(INT a,INT b)
{
INT m=1;
if(!b) return a;
while(m)
{
m=a%b;
a=b;
b=m;
}
return a;
}
//计算a*b%n
inline INT multi_mod(INT a,INT b,INT mod)
{
INT sum=0;
while(b)
{
if(b&1) sum=(sum+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return sum;
}
//计算a^b%n;
inline INT quickmod(INT a,INT b,INT mod)
{
INT sum=1;
while(b)
{
if(b&1) sum=multi_mod(sum,a,mod);
a=multi_mod(a,a,mod);
b>>=1;
}
return sum;
}
bool miller_rabin(INT n)
{
INT i,j,k=0;
INT u,m,buf;
//将n分解为m*2^k
if(n==2)
return true;
if(n<2||!(n&1))
return false;
m=n-1;
while(!(m&1))
k++,m>>=1;
for(i=0;i<9;i++)
{
if(p[i]>=n)
return true;
u=quickmod(p[i],m,n);
if(u==1)
continue;
for(j=0;j<k;j++)
{
buf=multi_mod(u,u,n);
if(buf==1&&u!=1&&u!=n-1)
return false;
u=buf;
}
//如果p[i]^(n-1)%n!=1那么n为合数
if(u-1)
return false;
}
return true;
}
INT extended_euclidean(INT n, INT m, INT &x, INT &y) {
if (m == 0) {
x = 1; y = 0; return n;
}
INT g = extended_euclidean(m, n % m, x, y);
INT t = x - n / m * y;
x = y;
y = t;
return g;
}
INT invmod(INT a,INT n)//求a对n的乘法逆元
{
INT x,y;
if(extended_euclidean(a,n,x,y)!=1) return -1;
return (x%n+n)%n;
}
void fff(char *str,INT *x){
INT t=0;
INT i,j=0;
for(i=0;i<strlen(str);i++){
t=t*10+str[i]-'0';
if(i%2==1){
x[j]=t;
j++;
t=0;
}
}
if(i%2) x[j]=t;
}
void rsa(INT *m,INT e,INT n){
for(INT i=0;i<100;i++)
m[i]=quickmod(m[i],e,n);
}
INT ranprim(){
INT p=0;
while(1){
p=(rand()%1000)+1000;
if(miller_rabin(p))
return p;
}
}
int main(){
srand((unsigned)time(NULL));
INT p,q,e,n,d,x;
do{
p=ranprim();
q=ranprim();
e=ranprim();
n=p*q;
d=invmod(e,(p-1)*(q-1));
x=(e*d)%((p-1)*(q-1));
}while(x!=1);
cout<<"p:"<<p<<" q:"<<q<<" e:"<<e<<" d:"<<d<<" n:"<<n<<endl;
char str[100];
int t;
INT m[100];
memset(m,0,sizeof(m));
while(scanf("%s",str)!=EOF){
t=(strlen(str)+1)/2;
fff(str,m);
rsa(m,e,n);
for(int i=0;i<t;i++)
printf("%d ",m[i]);
printf("\n");
rsa(m,d,n);
for(int i=0;i<t;i++)
printf("%d ",m[i]);
printf("\n");
}
}
我昨天刚给老师查的,没问题。输入数字,对数字加密。加密过程是两位一组。
2016-01-29 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
RSA加密、解密算法的C++实现(可以在VC6.0上运行):
#include<iostream> #include<cmath>
using namespace std;
#define MAXLENGTH 500 //明文最大长度,即所允许最大整数个数
int size = 0;//保存要进行加密的正整数的个数 int p, q; //两个大素数
int n, phi; //n = p * q,phi = (p-1) * (q-1) 是n的欧拉函数值 int e; //{e, n}为公开密钥 int d; //{d, n}为秘密密钥
int clear[MAXLENGTH], Ciphertext[MAXLENGTH];//分别用于存放加//密前的明//文和加密后的密文
int DecryptionText[MAXLENGTH];//存放解密后的明文
//以下为加密算法void Encryption() {//加密算法cout << " 请输入两个较大的素数:" ; cin >> p >> q ;cout << " p = " << p << ", q = " << q << endl; n = p * q;//求解 n,phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值 cout << " n = " << n << ", p非对称加密、解密算法RSA的C++实现_word文档在线阅读与下载_免费文档http://www.mianfeiwendang.com/doc/d83ae21a26eb0ef2373b3572/3hi = " << phi << endl; cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 互素的数 e:";cin >> e; float d0;
for( int i = 1; ; i++){///求解乘法逆元
e * d ≡ 1 (mod phi) d0 = (float)(phi*i+1) / e;
if( d0 - (int)d0 == 0 )}d = (int)d0; cout << endl;cout << " e = " << e << ", d = " << d << endl;cout << " 公开密钥 Pk = {e,n} = {" << e << "," << n << "}" << endl; cout << " 秘密密钥 Sk = {d,n} = {" << d << "," << n << "}" << endl; cout << endl;cout << " 请输入要加密的小于 " << n << " 正整数(以-1结束):" << endl; cout << " 加密前的明文为:"; for( i = 0; i < MAXLENGTH; i++) for(int j = 0; j<maxlength; j++)="" { cin >> clear[j]; if( clear[j] == -1 ) break; count = e;while(count > 0){//对明文进行加密 Ciphertext =(clear)^ e mod n //加密算法Ciphertext[j] = (Ciphertext[j] * clear[j]) % n;count-- ; } }cout << " 密文为:" ; size = j;//实际密文长度 for(int k=0; k<j; k="" ++) cout << Ciphertext[k] << " "; cout << endl ; }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为神州崛起凯歌高奏
君知否雁字云沉难写伤心句
披身月光星辉旖旎
跟随着父亲穿过小巷经过庭院
君知否雁字云沉难写伤心句
披身月光星辉旖旎
跟随着父亲穿过小巷经过庭院
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我有,不过我用到第三方库,OpenSSL,可以吗?
追问
OpenSSL是什么啊 。。我是初学者
追答
开源的加密库,里面包含了很多算法,比如对称加密,非对称加密等等。你可以到sourceforge上面下载一个,里面有工具和源代码,源代码示例中就有RSA的demo。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询