Hôm nay, tôi tìm thấy một trang mạng đối với chương trình cam kết của Pedersen; tuy nhiên, các máy phát điện g
và h
không độc lập và do đó một người châm ngôn có thể mở một cam kết c
thành nhiều cách. Tôi đã tính toán cam kết c
cho một tin nhắn tôi
và một sự ngẫu nhiên r
(giả sử rằng tôi biết S
):
c = g^m * h^r
= g^m * (g^s)^r
= g^m * (g^(s * r))
= g^(m + s * r)
Nói rằng, tôi đã cam kết với thông điệp tôi
, ngẫu nhiên r
, và cam kết là c
(c = g^(m + s * r)
. Bây giờ tôi muốn giả mạo nó, tức là mở nó cho một số tin nhắn khác tôi'
, không bằng tôi
, và do đó tôi cần tính toán một sự ngẫu nhiên mới r'
: r' = (m - m' + s * r) * s^(-1)
. Tôi đã lấy mã python ban đầu, đăng trên trang web và thực hiện một sửa đổi nhỏ, trả về S
. Hơn nữa, tôi đã viết một chức năng khác fake_message để tính toán một thông báo tùy ý để mở nó cho cùng một cam kết c, nhưng khi tôi đang chạy mã đã sửa đổi của mình, dòng cuối cùng,
r2 = print(vv.open(param, c, m2, r2))
đang trả về sai. Câu hỏi của tôi là: suy nghĩ của tôi có gì sai và việc triển khai Python? (Tôi đang sử dụng pycryptodome 3.10.1)
từ Crypto nhập ngẫu nhiên
từ số nhập Crypto.Util
nhập khẩu hệ thống
tạo def (param):
p = tham số [0]
q = thông số[1]
g = thông số [2]
h = thông số[3]
s = thông số [4]
trả về p, q, g, h, s
trình xác minh lớp:
thiết lập def (bản thân, bảo mật):
p = number.getPrime(2 * security, Random.new().read)
q = 2*p + 1 # hmm, không kiểm tra xem q có phải là số nguyên tố hay không.
g = number.getRandomRange(1, q-1)
s = number.getRandomRange(1, q-1)
print("Giá trị bí mật:\t",s)
h = pow(g,s,q)
tham số = (p,q,g,h,s)
in("p=",p)
in("q=",q)
in("g=",g)
in("h=",h)
in("s=",s)
thông số trả về
def open(self, param, c, m, r):
p,q,g,h,s = tạo (tham số)
res = (pow(g,m,q) * pow(h,r,q)) % q
trả lại (c == độ phân giải)
lớp tục ngữ:
def cam kết (bản thân, tham số, m):
p,q,g,h,s= tạo (tham số)
r = number.getRandomRange(1, q-1)
c = (pow(g,m,q) * pow(h,r,q)) %q
trả lại c, r
# Tôi sẽ mở nó để nhận một tin nhắn tùy ý ngẫu nhiên m2
def fake_message(self, param, c, m1, r1):
p,q,g,h,s = tạo (tham số)
#nhận một tin nhắn ngẫu nhiên
m2 = number.getRandomRange(1, q-1)
r2 = ((m1 - m2 + s * r1) * number.inverse(s, q))%q
trả lại (m2, r2)
bảo mật = 80
m = 2
vv = người xác minh()
pp = tục ngữ()
param = vv.setup(bảo mật)
c, r = pp.commit(tham số, m)
in(vv.open(param, c, m, r))
m2, r2 = pp.fake_message(tham số, c, m, r)
in(vv.open(param, c, m2, r2))