版权声明:转载请附上原文链接哟! https://blog.csdn.net/weixin_44170305/article/details/89672511
上天折断了你飞翔的羽翼,你也要给自己一双翅膀!
题目描述
QQ正在学习RAS算法,她查阅百度发现RSA是一个非对称加密算法,需要一对密钥(n,e1)和(n,e2),其中一个作为公钥为信息加密,另一个作为私钥为信息解密。其中,n是两个大质数p和q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2取值满足,e1与(p-1)*(q-1)互质和(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
设A为明文(需要加密的数据),B为密文(加密后的数据),则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)注:B^e2是指B的e2次方。
数据文件encryp.dic中存储了若干个整数,数据之间以空格隔开。
192 497 349 55 364 154 25 337 162 79 ......
你不需考虑n、e1、e2是如何得到的,也不需要考虑解密。为你提供n和e1,请按照加密算法,帮助QQ实现数据文件加密。
输入
第一行为n和e1,中间以空格隔开。
第二行为需要加密的数据个数m。
输出
对数据文件encryp.dic按照输入要求输出加密后的数据序列。
样例输入
copy
15 3 5
样例输出
3 8 4 10 4
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long long ksm(long a,long b,long c)//这里一定要用快速幂呦
{
long ans=1,base=a;
while(b)
{
if(b&1)
ans*=base%c;
base*=base%c;
b>>1;
}
return ans;
}
int main()
{
int a[10001],i;
long long n,e1,m;
FILE *fp;
fp=fopen("encryp.dic","r");
scanf("%lld%lld",&n,&e1);
scanf("%lld",&m);
for(i=1;i<=m;i++)
fscanf(fp,"%lld",&a[i]);
for(i=1;i<=m;i++)
printf("%lld ",ksm(a[i],e1,n)%n);
fclose(fp);
return 0;
}