Copyright © 2018 Joyce_BY
All rights reserved.
Contact by [email protected]
实验原理及算法
- generate key
本次仿真利用私钥(n,sID)生成公钥,具体过程如下:
A)选择一对512bit的素数p,q,计算n = p * q;
B)计算fn = (p-1) * (q-1);
C)根据e * d ≡ 1 (mod fn)计算出公钥(n,e)。
CODE
# key generation
def gen_key(p, q):
n = p * q
fn = (p - 1) * (q - 1)
d = 16337053
# generate e
# use e*d = k*fn + 1
x = fn
while (x + 1) % d:
x += fn
e = (x+1) // d
# public key, self key
return (n, e), (n, d)
- encryption and decryption
加密:c ≡ m^e mod n
解密::m ≡ c^d mod n
将plaintext字符串转化为ascii十进制数字。
CODE
def encryption(m, pk):
n = pk[0]
e = pk[1]
c = square_mod(m, e, n)
return c
def decryption(c, sk):
n = sk[0]
d = sk[1]
m = square_mod(c, d, n)
return m
# get bit string of plaintext
pt = 'test RSA'
m = int(''.join(format(ord(ch)) for ch in pt))
- 模重复平方算法
利用模重复平方算法求得大数取模的结果。
CODE
# b^m (mod m)
def square_mod(base, n, m):
b = base
bin_exp = bin(n)[2:][::-1]
a = 1
for bit in bin_exp:
if bit == '1':
a = a * b % m
b = b * b % m
return a
试验成功。