YTU 3015 文件数据加密

版权声明:转载请附上原文链接哟! 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44170305/article/details/89672511