已知(p+1)*(q+1)和p+q和e和c用python写rsa解码公式
时间: 2024-05-04 08:20:13 浏览: 146
RSA解码公式是:$m=c^d \mod n$
其中,$d$ 是私钥,$n=pq$ 是公钥中的模数,$c$ 是密文,$m$ 是明文。
我们可以根据已知条件进行计算,首先需要求出 $d$。根据 RSA 加密算法的原理,有:
$ed \equiv 1 \pmod{(p-1)(q-1)}$
我们已知 $p+q$,因此可以求出 $n$:
$n=pq=(p+q-1)+1$
然后,可以求出 $(p-1)(q-1)$:
$(p-1)(q-1)=n-(p+q)+2$
接下来,可以根据扩展欧几里得算法求出 $d$:
```python
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('No modular inverse')
else:
return x % m
p_plus_q = 123
e = 65537
c = 456
n = p_plus_q + 1
phi_n = n - p_plus_q + 2
d = modinv(e, phi_n)
```
最后,可以使用解码公式解密密文:
```python
m = pow(c, d, n)
```
完整代码如下:
```python
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('No modular inverse')
else:
return x % m
p_plus_q = 123
e = 65537
c = 456
n = p_plus_q + 1
phi_n = n - p_plus_q + 2
d = modinv(e, phi_n)
m = pow(c, d, n)
print(m)
```
阅读全文