Это на моем client.py. Мой код работает так:
ПРИМЕЧАНИЕ: я пропустил соединение с сокетом, потому что там нет ошибок
запускается первый keyMaker для генерации и сохранить мои publi c и приватные ключи.
Далее, pubkeyReader запускается для облегчения обмена ключами с server.py
Затем prikeyReader запускается для чтения секретного ключа
после чего получатель запускается для расшифровки сообщений.
def keyMaker(self):
print("Generating an RSA key pair...")
self.keypair = RSA.generate(1024)
with open("Client Keys/clientPrivate.pem","w") as f:
print(self.keypair.exportKey().decode() ,file=f)
f.close()
print("Private Key stored on to 'clientPrivate.pem'")
with open("Client Keys/clientPublic.pem","w") as f:
print(self.keypair.publickey().exportKey().decode() ,file=f)
f.close()
print("Public Key stored on to 'clientPublic.pem'")
def pubkeyReader(self):
publicKeyContent = clientsocket.recv(1024).decode()
clientsocket.sendall(self.keypair.publickey().exportKey())
self.publicKey = RSA.import_key(publicKeyContent)
print("Server public key imported")
print(f"Public Key:\n{publicKeyContent}")
print(f"keysize: {self.publicKey.size_in_bytes()}")
self.size_limit = self.publicKey.size_in_bytes()
self.cipher = PKCS1_OAEP.new(self.publicKey)
def prikeyReader(self):
privateKeyContent = open("Client Keys/clientPrivate.pem",'r').read()
self.privateKey = RSA.import_key(privateKeyContent)
print("Client private key imported")
self.keysize = self.privateKey.size_in_bytes()
self.deCipher = PKCS1_OAEP.new(self.privateKey)
def receiver(self):
reply = clientsocket.recv(1024)
print(reply)
print(type(reply))
if len(reply) > self.keysize:
plain_text = b""
while len(reply) > 0:
block = reply[:self.keysize]
reply = reply[self.keysize:]
plain_text += self.deCipher.decrypt(block)
else:
plain_text = cipher.decrypt(reply)
self.messageReceived = plain_text
Это мой server.py
Он работает аналогично client.py, но единственное отличие заключается в том, что я не запрограммирован в получателе и это противоположно для client.py
Это потому, что при проверке файлов .pem я понимаю, что сохраненный ключ и ключ, который я печатаю на экране, не совпадают, есть некоторые случайные '1', которые каким-то образом хранится как строчная буква L
def keyMaker(self):
print("Generating an RSA key pair...")
self.keypair = RSA.generate(1024)
with open("Server Keys/serverPrivate.pem","w") as f:
print(self.keypair.exportKey().decode() ,file=f)
f.close()
print("Private Key stored on to 'serverPrivate.pem'")
with open("Server Keys/serverPublic.pem","w") as f:
print(self.keypair.publickey().exportKey().decode() ,file=f)
f.close()
print("Public Key stored on to 'serverPublic.pem'")
def pubkeyReader(self):
self.con.sendall(self.keypair.publickey().exportKey().decode().encode())
publicKeyContent = self.con.recv(1024).decode()
self.publicKey = RSA.import_key(publicKeyContent)
print("Client public key imported")
print(f"Public Key:\n{publicKeyContent}")
print(f"keysize: {self.publicKey.size_in_bytes()}")
self.size_limit = self.publicKey.size_in_bytes()
self.cipher = PKCS1_OAEP.new(self.publicKey)
def prikeyReader(self):
privateKeyContent = open("Server Keys/serverPrivate.pem",'r').read()
self.privateKey = RSA.import_key(privateKeyContent)
print("Server private key imported")
print(f"Private Key:\n{privateKeyContent}")
self.keysize = self.privateKey.size_in_bytes()
print(f"keysize: {self.keysize}")
self.deCipher = PKCS1_OAEP.new(self.privateKey)
def sender(self,msg):
msg = msg.encode()
if len(msg)>self.size_limit:
# need to encrypt the data in mulitple blocks
encrypted = b''
while len(msg) > 0:
block = msg[:self.size_limit]
data = msg[self.size_limit:]
encrypted += self.cipher.encrypt(block)
else:
encrypted = self.cipher.encrypt(msg)
print(encrypted)
reply = str(encrypted).encode()
self.con.sendall(reply)