文件数据加密
时间: 1ms 内存:128M
描述:
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按照输入要求输出加密后的数据序列。
示例输入:
15 3
5
示例输出:
3 8 4 10 4
提示:
参考答案(内存最优[0]):
#include<stdio.h>
int main()
{
int i,j,m,n,p,q,sum=0;
FILE *fp;
int a,b,c,ch;
scanf("%d %d",&m,&n);
scanf("%d",&q);
fp=fopen("encryp.dic","rb");
for(j=0;j<q-1;j++)
{
fscanf(fp,"%d",&ch);
c=1;
for(i=0;i<n;i++)
{
c=c*ch;
}
printf("%d ",c);
}
fscanf(fp,"%d",&ch);
c=1;
for(i=0;i<n;i++)
{
c=c*ch;
}
printf("%d",c);
}
参考答案(时间最优[0]):
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,e1;
int i,j;
int num,value;
int m;
FILE *fin; /* 输入文件 */
fin=fopen("encryp.dic","r"); /* 打开输入文件读 */
if(!fin) /* 文件打开失败 */
{
fprintf(stderr,"error open file!\n"); /* 输出错误信息到标准错误设备 */
exit(-1); /* 强制退出,并返回错误码 */
}
scanf("%d %d",&n,&e1);
scanf("%d",&m);
for(i=0; i<m; i++)
{
if(fscanf(fin,"%d",&num)==-1)
break;
num=num%n;
value=num;
for(j=0; j<e1-1; j++)
value=(value*num)%n;
//num=(int)pow(num,e1)%n;
printf("%d",value);
if(i==m-1)
printf("\n");
else
printf(" ");
}
fclose(fin); /* 关闭输入文件*/
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。