文件数据加密

时间: 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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。