[Python] inconsistency in RSA algorithm when using pycryptodome

Discussão em 'Python' iniciado por Stack, Agosto 3, 2025.

  1. Stack

    Stack Membro Participativo

    I am using python3-pycryptodome version 3.9.0-150200.9.1 on openSUSE Leap version 15.6.

    While using Crypto.PublicKey.RSA class, I noticed that generated RSA keys have some algorithmic inconsistency.

    First, let me show you snippet of my code,

    from Crypto.PublicKey import RSA
    import gmpy2 as gm

    zero = gm.mpz(0)
    one = gm.mpz(1)

    key = RSA.generate(1024)
    p = gm.mpz(key.p)
    q = gm.mpz(key.q)
    n = gm.mpz(key.n)
    d = gm.mpz(key.d)
    e = gm.mpz(key.e)
    f = gm.mul(gm.sub(p, one), gm.sub(q, one))
    t, r = gm.t_divmod(gm.sub(gm.mul(e, d), one), f)

    print("T:", t, "\nR:", r, "\n")
    assert(r == zero)


    Since e and d are multiplicative inverse of each other with respect to f, so the value of r should always be zero, but this assert randomly fails when I generate multiple keys this way. Any idea why?

    Do note that however, the generated keys correctly encrypt and decrypt even if the above assert fails.

    Here is an example output,

    N: 148502774403628390194611500709682347814667593710263804255157829583856187369359709690285563468375111786415727941281838364540498319732753028415238432642064018564768129734406037062641477861055248558990411663521667242748082850681361695820916286468764801272766079977549468298872839357850688001921905070150870021617

    F: 148502774403628390194611500709682347814667593710263804255157829583856187369359709690285563468375111786415727941281838364540498319732753028415238432642063994175826236354417984972173597931150214536367983662042569355961801875348542016817518199738121181705454851577038738077546432331820850702935944555788782117440

    D: 3786287874221628833060271941142911125529353972159943582788217876798211113616120434328141578912323768742993739941575982481376680422409348089969728845438894796344787140928803863554860738865651625260009135296914439478294793149354932137846389802769093381050561713735488167704149676139058582518170514697039795113

    P: 12644301210276125955062852673893145078336308093529189288020587426377781795770169081395069044878276629331783016359362180011337579202434183256912567514342137

    Q: 11744640683103862097027615206036759955686314334472289809866198854597551023908834316691661598741290681896617494370859146395688450634864802703601794573562041

    E: 65537

    T: 1670

    R: 142315158803477207269836021513445583322389777305669479077859586684528846228969721786523664990526148795315072610395095099351310889743888318897936831281977994418500143172983902264999698017352288930685984342790795632796726797209019432783454941415699465801060899427995457324315330984661648590313613532630916195880

    Traceback (most recent call last):
    File "./utils.py", line 226, in <module>
    (n, f, d, p, q, s, k, u, e, g, h) = generate_rsa(1024, TYPE_CRYPTODOME, debug=True)
    File "./utils.py", line 83, in generate_rsa
    assert(r == zero)
    AssertionError


    I am expecting the assert in code snippet to be always true but it randomly fails.

    Continue reading...

Compartilhe esta Página