Điểm:0

Mã Python cho 'Thế hệ chính tắc có thể kiểm chứng của Trình tạo g', FIPS 186-4, trả về Sai

lá cờ in

Chỉnh sửa: nếu bất cứ ai, thiếu kinh nghiệm như tôi, đặt câu hỏi này, nó đã được trả lời tại ngăn xếp chồng lên nhau.

Tại sao mã Python, xem bên dưới, trả về false?

Thêm bối cảnh: Tôi đang trải qua FIPS 186-4 và ở trang 43, có một thuật toán, A.2.3 Tạo Canonical có thể kiểm chứng của Trình tạo g, để tạo ra máy phát điện. Tôi đã viết mã Python, xem bên dưới, mã hóa thuật toán này. Tuy nhiên, nó luôn trả về false so với dữ liệu thử nghiệm mà tôi đã lấy từ Vectơ thử nghiệm NIST (Test Vectors, FIPS-186-4, DSA. Tôi cũng đã đăng toàn bộ tệp tại [gist][3).

nhập mô tả hình ảnh ở đây

từ Crypto.Hash nhập SHA256


P = 0xfbdf34147bf5d8a45671c906923c1dbe86e9123fae5750d6c1986e00a9946f7f833372a436f98f75dc798bb454825eb625d49011d1e4401baacb653bb9dac6cc8ac91e61ba4310458ff6d6ddabcba29db025eedba6e2f837344dee4814e2a7e2e92ceb1e6e665ee08ce187ffd420fee7a99e046a4af719fa8c689630e88f8729
Hỏi = 0x93db61194cb0b9236eea63617d149cd6dd8e2bf1
domain_parameter_seed = 0x75709e9ca555a80cb7ab154e9d29d2775fe215d8
chỉ mục = 0xae
G = 0x7db10e27fffe43fc9582367a449f7be217130cdf89a5eff65fbebefc9478ba39ad03d1b0d0254c0f1b8246d914c0d1df25f55a5dabbb51caa1942403fdc22c832e4d7048ce0ad64cb76252fdcfaecd78722c2e10417495ee9d4e0d8376f891a3042b103de915355c0e60e168cf48c0fa232a13bf9b58a0f9b3ad7db7ad39c536



def Hash(số):
    string = number.to_bytes((number.bit_length()+7)//8, 'big')
    trả về int(SHA256.new(string).hexdigest(), 16)


def tính toán_gen():
    k = (P - 1) // Q
    để đếm trong phạm vi (1, 0xffff):
  
        U = số đếm + 2^16 * (chỉ số + 2^16 * (0x6767656e + 2^32 * domain_parameter_seed))
        W = Băm(U)
        g = pow(W, k, P)
        in(hex(g))
        nếu g != 1:
            nghỉ
 
    trả lại g


in (compute_gen() == G)
Điểm:2
lá cờ ng

Lý do mật mã gần nhất khiến mã không hoạt động là nó không thực hiện quy định

mục lục là một xâu bit có độ dài 8

khi nó làm

U = số đếm + 2^16 * (chỉ số + 2^16 * (0x6767656e + 2^32 * domain_parameter_seed))

nơi thứ hai 2^16 dự định là $2^8$.

Một lỗi lập trình trong cùng dòng đó là ^ có nghĩa là XOR, không phải sức mạnh; và có mức độ ưu tiên thấp hơn so với phép cộng và phép nhân trên đó.

Tổng quát hơn, mã này sử dụng các số nguyên trong đó phải có các chuỗi phụ. Bytetring dễ dàng ghép nối và ngăn ngừa các lỗi như lỗi hiện đang xảy ra khi byte đầu tiên của domain_parameter_seed thay đổi từ 0x75 đến 0x00, đó là hoàn toàn hợp pháp.

sử dụng hexdigest và chuyển đổi nó trở lại số nguyên hoạt động trong ngữ cảnh, nhưng thực tế lập trình rất tệ. Sử dụng tiêu.

lá cờ in
Cảm ơn vì câu trả lời. Xin lỗi, tôi không rành lắm về phép xã giao ở đây.

Đă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.