Working interface.

- Encrypt a signle word message. for now
    - Decrypt only with target private key
    - Runtime errors when using wrong key to decrypt or message too long.
This commit is contained in:
HeshamTB 2020-04-16 14:33:24 +03:00
parent a1e05a572a
commit feeea933c3
Signed by: Hesham
GPG Key ID: 74876157D199B09E

43
rsa.py
View File

@ -21,12 +21,25 @@ def main():
except Exception as ex: except Exception as ex:
print(ex) print(ex)
exit(1) exit(1)
if sys.argv[1] == "encrypt" and len(sys.argv) == 4: if len(sys.argv) == 4:
msg = sys.argv[2] if sys.argv[1] == "encrypt": ##rsa encrypt <message> <key>
keyName = sys.argv[3] msg = sys.argv[2]
key = readKeyFile(keyName) keyName = sys.argv[3]
key_public = (key[0], key[1]) key = readKeyFile(keyName)
msg_encrypted = encrypt(msg, key_public) key_public = (key[0], key[1])
msg_encrypted = encrypt(msg, key_public)
print("Encrypted msg: ", msg_encrypted)
if sys.argv[1] == "decrypt": ##rsa decrypt <cipher> <key>
fileName = sys.argv[2]
key = readKeyFile(sys.argv[3])
cipher = int()
with open(fileName, "r") as cipherFile:
cipher = int(cipherFile.readline()) ##one line may make problems later with padding
msg = decrypt(cipher, key[2],key[0])
print("Decrypted message: ", msg)
def generateKeys(bits=64): def generateKeys(bits=64):
#Primes of size 32 bit random #Primes of size 32 bit random
@ -55,10 +68,24 @@ def generateKeys(bits=64):
return n, e, d return n, e, d
def encrypt(message, publicKey): def encrypt(message, publicKey):
return None msg_text = message
n = publicKey[0]
e = publicKey[1]
print("using n: {0}, e: {1}".format(n, e))
msg_number_form = int.from_bytes(msg_text.encode(),"little")
print("Message: %s or %d" % (msg_text, msg_number_form))
msg_encrypted_number_form = pow(msg_number_form, e, n) # c = msg^e mod n
return msg_encrypted_number_form
def decrypt(cipher, privateKey, n): def decrypt(cipher, privateKey, n):
pass msg_encrypted_number_form = cipher
d = privateKey
msg_decrypted_number_form = pow(msg_encrypted_number_form, d, n) # m = c^d mod n
msg_decrypted = int(msg_decrypted_number_form)
msg_decrypted = str(msg_decrypted.to_bytes(msg_decrypted.bit_length(), "little").decode()).strip()
return msg_decrypted
def getPrime(bits): def getPrime(bits):
while True: while True: