Điểm:0

Giả mạo cam kết Pedersen

lá cờ in

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 gh 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))
Daniel S avatar
lá cờ ru
Vấn đề là biểu thức `number.inverse(s,q)` và cả `%q`. Bạn cần tính toán nghịch đảo của $s$ modulo thứ tự của nhóm nhân của $q$ chứ không phải modulo $q$ (tương tự như vậy, phép rút gọn cuối cùng không được theo modulo $q$). Nếu $q$ là số nguyên tố thì thứ tự là $q-1$, nhưng như bạn lưu ý chính xác, mã này không kiểm tra xem $q$ có phải là số nguyên tố hay không. Để khắc phục, hãy kiểm tra xem $q$ có phải là số nguyên tố không rồi đổi thành `((m1 - m2 + s * r1) * number.inverse(s, q-1))%(q-1)`
lá cờ in
Cảm ơn @DanielS.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.