
import os
import random
import sys

from . import cryptomath_module as cryptoMath  # noqa: N812
from . import rabin_miller as rabinMiller  # noqa: N812




def _a (  )	->    List[Any]:

							'''simple docstring'''






							print("Making key files..."       )
							make_key_files("rsa"			,				10_24       )
							print("Key files generation successful."       )




def _a (  SCREAMING_SNAKE_CASE__      :  int       )	->    List[str]:

							'''simple docstring'''






							print("Generating prime p..."       )
							SCREAMING_SNAKE_CASE__       :      Optional[int]     =						rabinMiller.generate_large_prime(lowerCamelCase_       )
							print("Generating prime q..."       )
							SCREAMING_SNAKE_CASE__       :      List[str]     =						rabinMiller.generate_large_prime(lowerCamelCase_       )
							SCREAMING_SNAKE_CASE__       :      str     =						p * q

							print("Generating e that is relatively prime to (p - 1) * (q - 1)..."       )
							while True:
														SCREAMING_SNAKE_CASE__       :      str     =						random.randrange(2 ** (key_size - 1)			,				2 ** (key_size)       )
														if cryptoMath.gcd(lowerCamelCase_			,				(p - 1) * (q - 1)       ) == 1:
																					break

							print("Calculating d that is mod inverse of e..."       )
							SCREAMING_SNAKE_CASE__       :      Any     =						cryptoMath.find_mod_inverse(lowerCamelCase_			,				(p - 1) * (q - 1)       )

							SCREAMING_SNAKE_CASE__       :      Union[str, Any]     =						(n, e)
							SCREAMING_SNAKE_CASE__       :      List[Any]     =						(n, d)
							return (public_key, private_key)




def _a (  SCREAMING_SNAKE_CASE__      :  str			,				SCREAMING_SNAKE_CASE__      :  int       )	->    Optional[int]:

							'''simple docstring'''






							if os.path.exists(f'''{name}_pubkey.txt'''       ) or os.path.exists(f'''{name}_privkey.txt'''       ):
														print("\nWARNING:"       )
														print(
														    f'''\"{name}_pubkey.txt\" or \"{name}_privkey.txt\" already exists. \n'''
														    "Use a different name or delete these files and re-run this program."       )
														sys.exit()

							SCREAMING_SNAKE_CASE__       :      Tuple     =						generate_key(lowerCamelCase_       )
							print(f'''\nWriting public key to file {name}_pubkey.txt...'''       )
							with open(f'''{name}_pubkey.txt'''			,				"w"       ) as out_file:
														out_file.write(f'''{key_size},{public_key[0]},{public_key[1]}'''       )

							print(f'''Writing private key to file {name}_privkey.txt...'''       )
							with open(f'''{name}_privkey.txt'''			,				"w"       ) as out_file:
														out_file.write(f'''{key_size},{private_key[0]},{private_key[1]}'''       )


if __name__ == "__main__":
		main()













def _a (  SCREAMING_SNAKE_CASE__      :  str			,				SCREAMING_SNAKE_CASE__      :  str       )	->    int:

							'''simple docstring'''






							if len(SCREAMING_SNAKE_CASE__       ) != len(SCREAMING_SNAKE_CASE__       ):
														raise ValueError("String lengths must match!"       )

							SCREAMING_SNAKE_CASE__       :      Dict     =						0

							for chara, chara in zip(SCREAMING_SNAKE_CASE__			,				SCREAMING_SNAKE_CASE__       ):
														if chara != chara:
																					count += 1

							return count


if __name__ == "__main__":
		import doctest

		doctest.testmod()






