Puncte:0

Codul Python pentru „Generația canonică verificabilă a generatorului g”, FIPS 186-4, returnează False

drapel in

Edit: dacă cineva, fără experiență ca mine, ajunge la această întrebare, i s-a răspuns la stackoverflow.

De ce codul Python, vezi mai jos, returnează false?

Mai mult context: trec prin FIPS 186-4 iar la pagina 43, există un algoritm, A.2.3 Generarea canonică verificabilă a generatorului g, pentru a genera generatoare. Am scris un cod Python, vezi mai jos, care codifică acest algoritm. Cu toate acestea, returnează întotdeauna false față de datele de testare de la care am luat Vectori de testare NIST (Test Vectors, FIPS-186-4, DSA. De asemenea, am postat întregul fișier la [gist][3).

introduceți descrierea imaginii aici

din Crypto.Hash import SHA256


P = 0xfbdf34147bf5d8a45671c906923c1dbe86e9123fae5750d6c1986e00a9946f7f833372a436f98f75dc798bb454825eb625d49011d1e4401baacb653bb9dac6cc8ac91e61ba4310458ff6d6ddabcba29db025eedba6e2f837344dee4814e2a7e2e92ceb1e6e665ee08ce187ffd420fee7a99e046a4af719fa8c689630e88f8729
Q = 0x93db61194cb0b9236eea63617d149cd6dd8e2bf1
domain_parameter_seed = 0x75709e9ca555a80cb7ab154e9d29d2775fe215d8
indice = 0xae
G = 0x7db10e27fffe43fc9582367a449f7be217130cdf89a5eff65fbebefc9478ba39ad03d1b0d0254c0f1b8246d914c0d1df25f55a5dabbb51caa1942403fdc22c832e4d7048ce0ad64cb76252fdcfaecd78722c2e10417495ee9d4e0d8376f891a3042b103de915355c0e60e168cf48c0fa232a13bf9b58a0f9b3ad7db7ad39c536



def Hash(număr):
    șir = number.to_bytes((number.bit_length()+7)//8, „mare”)
    return int(SHA256.new(string).hexdigest(), 16)


def compute_gen():
    k = (P - 1) // Q
    pentru numărarea în interval (1, 0xffff):
  
        U = numărare + 2^16 * (index + 2^16 * (0x6767656e + 2^32 * domain_parameter_seed))
        W = Hash(U)
        g = pow(W, k, P)
        imprimare (hex (g))
        dacă g != 1:
            pauză
 
    întoarcere g


print (compute_gen() == G)
Puncte:2
drapel ng

Cel mai apropiat motiv criptografic pentru care codul nu funcționează este că nu implementează prescripția

index este un șir de lungime 8

când o face

U = numărare + 2^16 * (index + 2^16 * (0x6767656e + 2^32 * domain_parameter_seed))

unde al doilea 2^16 este destinat să fie $2^8$.

O eroare de programare în aceeași linie este aceea ^ înseamnă XOR, nu putere; și are prioritate mai mică decât adunarea și înmulțirea pe deasupra.

Mai general, codul folosește numere întregi unde ar trebui să existe șiruri de octeți. Bytetring-urile facilitează concatenarea și previn erori, cum ar fi cea care apare în prezent când primul octet al domain_parameter_seed modificări de la 0x75 la 0x00, care este perfect legitim.

Folosind hexdigest și convertirea lui înapoi în întreg funcționează în context, dar este o practică teribilă de programare. Utilizare digera.

drapel in
Multumesc pentru raspuns. Scuze, nu sunt foarte familiarizat cu eticheta aici.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.