Для проекта в университете я получил следующие настройки:
- Publi c key (p, g, h)
- Два файла зашифрованного текста: (c1, c2) & (c3, c4)
- Файлы подписи вышеупомянутых файлов: (r1, s1) & (r2, s2)
Цель состоит в том, чтобы восстановить открытые тексты.
Я узнал из файлов сигнатур, что данные r-значения одинаковы (r1 = r2 = r). Это приводит к возможности пересчета используемого закрытого ключа см. .
В основном мне нужны два алгоритма:
k ≡ (m1 - m2) (s1 - s2) ^ - 1 mod (p − 1)
k ≡ (m1 / (s1 - s2) - m2 / (s1 - s2)) mod (p-1)
, а затем
x ≡ (m1 - k * s1) r ^ −1 mod (p − 1)
x ≡ (m1 / r - k * s1 / r) mod (p-1)
Итак, я подумал, что написать программу python, реализующую алгоритмы, упомянутые в ссылке, не должно быть так сложно. Но я застрял. По некоторым причинам я не получаю правильные значения из моих расчетов. Может, кто-нибудь меня сюда подтолкнет?
import random
import base64
from gmpy2 import *
from Crypto.Util.number import inverse
from binascii import hexlify, unhexlify
g = 262470350957996892686231567...
p = 394020061963944792122790401...
h = 114121123070543781308127611...
def getSign(file):
enc_file = open(file, "rb")
enc_byte = enc_file.read()
r, s = (enc_byte.decode("utf-8")).split()
return r, s
def getMess(file):
enc_file = open(file, "rb")
enc_base64 = enc_file.read()
enc_byte = base64.decodebytes(enc_base64)
c1, c2 = (enc_byte.decode("utf-8")).split()
c1, c2 = int(c1), int(c2)
return c1, c2
def decrypt(c1, c2, a):
df = pow(c1, a, p)
m = (c2 * inverse(df, p)) % p
return m
r1, s1 = getSign("secret1.enc.sig")
c11, c12 = getMess("secret1.enc")
r2, s2 = getSign("secret2.enc.sig")
c21, c22 = getMess("secret2.enc")
if(r1 == r2):
r = int(hexlify(str.encode(r1)), 16)
s1_hex = hexlify(str.encode(s1))
s1_int = int(s1_hex, 16)
s2_hex = hexlify(str.encode(s2))
s2_int = int(s2_hex, 16)
m1 = c12
m2 = c22
ds = s1_int - s2_int
ps = p - 1
k1 = (m1 * inverse(ds, ps)) % ps
k2 = (m2 * inverse(ds, ps)) % ps
k = k1 - k2
print("k = {}".format(k))
x1 = (m1 * inverse(r, ps)) % ps
x21 = k * s1_int
x2 = (x21 * inverse(r, ps)) % ps
x = x1 - x2
dm = decrypt(c21, c22, x)
x = format(dm, 'x')
message = unhexlify(x)
print("g = {}".format(g))
print("p = {}".format(p))
print("h = {}".format(h))
print("r = {}".format(r))
print("k = {}".format(k))
print("x = {}".format(x))
print("Decrypted Hex (x) : {}".format(x))
print("Decrypted Message : {}".format(message))