题目描述
RSA是最著名的公钥加密算法。在这种算法中,每个参与者都有一个私钥,该私钥与其他人共享,并且一个公钥被发布,以便每个人都知道它。要向该参与者发送安全消息,您可以使用广为人知的公钥加密消息;然后参与者使用他或她的私钥解密消息。以下是RSA的流程:
首先,选择两个不同的大素数P和Q,并乘以它们来获得N(=P∗Q)。
其次,选择正整数E(0<E<N)作为加密密钥,使E和T=(P−1)∗(Q−1)相对为素数。
第三,计算解密密钥D,使0<=D<T和(E∗D)modT=1。这里D是E,模量T的乘法逆。
现在公钥由对E,N构建,私钥是D,N。P和Q可以丢弃。
加密由C=(ME)modN定义,解密由M=(CD)modN定义,这里M,这是一个非负整数,小于N,是明文消息,C是生成的密文。
为了说明这个想法,让我们看看下面的例子:
我们选择P=37,Q=23,所以N=P∗Q=851,T=792。如果我们选择E=5,D将是317((5∗317)mod792=1)。公钥是5,851,私钥是317,851。对于给定的明文M=7,我们可以得到密文C=(75)mod851=638。
众所周知,要正确选择非常大的P和Q,需要数千年才能打破一把钥匙,但对于小公司来说,这是另一回事。
现在,您获得了密文C和公钥E,N,您能找到明文M吗?
输入
输入将包含几个测试用例。每个测试用例包含三个正整数C,E,N(0<C<N,0<E<N,0<N<262)。
输出
以单行输出明文 M。
输入数 1
638 5 851
输出数位 1
7
来源
POJ 月度,静态