Как правильно отправить ключи RSA publi c через сокеты - PullRequest
0 голосов
/ 19 февраля 2020

Это на моем 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...