您的位置:首页 > 其它

杭电1211

2016-03-08 11:33 260 查看
题目描述:

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) = me mod n

When you want to decrypt data, use this method :

M = D(c) = cd 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();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: