1313
1414from __future__ import annotations
1515
16- import random
16+ import secrets
17+
18+
19+ def _extended_gcd (a : int , b : int ) -> tuple [int , int , int ]:
20+ old_r , r = a , b
21+ old_s , s = 1 , 0
22+ old_t , t = 0 , 1
23+ while r != 0 :
24+ q = old_r // r
25+ old_r , r = r , old_r - q * r
26+ old_s , s = s , old_s - q * s
27+ old_t , t = t , old_t - q * t
28+ return old_r , old_s , old_t
29+
30+
31+ def _modinv (a : int , m : int ) -> int :
32+ g , x , _ = _extended_gcd (a , m )
33+ if g != 1 :
34+ raise ValueError (f"Modular inverse does not exist: gcd({ a } , { m } ) = { g } " )
35+ return x % m
1736
1837
1938def generate_key (k : int , seed : int | None = None ) -> tuple [int , int , int ]:
2039 """Generate an RSA key triplet (n, e, d).
2140
2241 Args:
2342 k: The number of bits in the modulus n.
24- seed: Optional random seed for reproducibility.
43+ seed: Optional random seed for reproducibility
44+ (ignored, kept for API compatibility).
2545
2646 Returns:
2747 A tuple (n, e, d) where n is the modulus, e is the encryption
2848 exponent, and d is the decryption exponent.
2949
3050 Examples:
31- >>> n, e, d = generate_key(16, seed=42 )
51+ >>> n, e, d = generate_key(16)
3252 """
3353
34- def _modinv (a : int , m : int ) -> int :
35- """Calculate the modular inverse of a mod m.
36-
37- Args:
38- a: The integer.
39- m: The modulus.
40-
41- Returns:
42- b such that (a * b) % m == 1.
43- """
44- b = 1
45- while (a * b ) % m != 1 :
46- b += 1
47- return b
48-
4954 def _gen_prime (k : int , seed : int | None = None ) -> int :
5055 """Generate a random prime with k bits.
5156
5257 Args:
5358 k: The number of bits.
54- seed: Optional random seed .
59+ seed: Unused, kept for API compatibility .
5560
5661 Returns:
5762 A prime number.
@@ -65,13 +70,12 @@ def _is_prime(num: int) -> bool:
6570 for i in range (2 , int (num ** 0.5 ) + 1 )
6671 )
6772
68- random .seed (seed )
6973 while True :
70- key = random . randrange (int (2 ** (k - 1 )), int (2 ** k ))
74+ key = secrets . randbelow (int (2 ** k ) - int ( 2 ** (k - 1 ))) + int (2 ** ( k - 1 ))
7175 if _is_prime (key ):
7276 return key
7377
74- p_size = k / 2
78+ p_size = k // 2
7579 q_size = k - p_size
7680
7781 e = _gen_prime (k , seed )
0 commit comments