题目描述:
RSA is one of the most powerful methods to encrypt data. The RSA algorithm is described as follow:
> choose two large prime integer p, q
> calculate n = p × q, calculate F(n) = (p - 1) × (q - 1)
> choose an integer e(1 < e < F(n)), making gcd(e, F(n)) = 1, e will be the public key
> calculate d, making d × e mod F(n) = 1 mod F(n), and d will be the private key
You can encrypt data with this method :
C = E(m) = m e mod n
When you want to decrypt data, use this method :
M = D(c) = c d mod n
Here, c is an integer ASCII value of a letter of cryptograph and m is an integer ASCII value of a letter of plain text.
Now given p, q, e and some cryptograph, your task is to "translate" the cryptograph into plain text.
> choose two large prime integer p, q
> calculate n = p × q, calculate F(n) = (p - 1) × (q - 1)
> choose an integer e(1 < e < F(n)), making gcd(e, F(n)) = 1, e will be the public key
> calculate d, making d × e mod F(n) = 1 mod F(n), and d will be the private key
You can encrypt data with this method :
C = E(m) = m e mod n
When you want to decrypt data, use this method :
M = D(c) = c d mod n
Here, c is an integer ASCII value of a letter of cryptograph and m is an integer ASCII value of a letter of plain text.
Now given p, q, e and some cryptograph, your task is to "translate" the cryptograph into plain text.
RSA加密解密算法,p,q在32位以内,所以n在64位以内(C#用long,C/C++用__int64),注意不用超出数据类型的范围即可,AC代码:
using System;
namespace a1
{
class Program
{
public static void Main(string[] args)
{
string str = string.Empty;
while((str = Console.ReadLine())!=null){
int p,q,e,l,d;
string[] s=str.Split(' ');
p=Convert.ToInt32(s[0]);
q=Convert.ToInt32(s[1]);
e=Convert.ToInt32(s[2]);
l=Convert.ToInt32(s[3]);
str=Console.ReadLine();
string[] s1=str.Split(' ');
int[] a=new int[l];
for(int i=0;i<l;i++)
a[i]=Convert.ToInt32(s1[i]);
long n,fn;
n=(long)p*(long)q;
fn=(long)(p-1)*(long)(q-1);
for(int i=1;;i++)
if((fn*i+1)%e==0){d=(int)(fn*i+1)/e;break;}
for(int i=0;i<l;i++){
long k=1;
for(int j=0;j<d;j++){
k=k*a[i]%n;
}
Console.Write((char)k);
}
Console.WriteLine();
}
}
}
}