[Python] How to convert a key string back into a pycrypto key object? (Python)

Discussão em 'Python' iniciado por Stack, Março 1, 2025.

  1. Stack

    Stack Membro Participativo

    I am replicating a TCP client-server secure handshake in python using the pycrypto module. When the "server" sends the public key over the socket, I am forced to convert the public key to a string. The "client" then receives the public key as a string, which cannot be encrypted according the pycrypto module.

    I get the error:


    AttributeError: 'str' object has no attribute 'encrypt' in reference to enc_data = public_key.encrypt(secret_piece, 12) on the client side.
    ​

    How do convert the string public_key back to its original value when it was first generated by the RSA module?

    Server Code:

    def main():
    host = '127.0.0.1'
    port = 5000

    s = socket.socket()
    s.bind((host,port))

    s.listen(1)
    c, addr = s.accept()
    print "Connection from: "+str(addr)
    while True:
    data = c.recv(1024)
    if not data:
    break
    print "from connected user: "+str(data)

    print "Start the SSL Handshake..."
    a = raw_input('Press enter to generate the key pair. ')

    key = RSA.generate(1024, random_generator)
    public_key = key.publickey()

    print "Key pair generated"
    a = raw_input('Press enter to send public key to client ')

    print "Sending key..."

    if c.send(str(public_key)):
    print "Public Key Sent"

    print "Waiting for secret list..."

    if c.recv(1024):
    print "List received."

    secret_list = c.recv(1024)

    a = raw_input('Press enter to check the information from the list. ')

    decrypted_info = key.decrypt(secret_list.enc_data)

    match_or_not = SHA256.new(decrypted_info).digest() == secret_list.hash_value

    if match_or_not:
    print "Info Matches. Sending the ciphertext..."

    info_to_be_encrypted = "It seems all secure. Let's talk!"
    aes = AES.new(Random.get_random_bytes(16), AES.MODE_ECB)
    cipher_text = aes.encrypt(info_to_be_encrypted)

    if c.send(cipher_text):
    print "Ciphertext sent."


    Client Code

    def main():
    host = '127.0.0.1'
    port = 5000

    s = socket.socket()
    s.connect((host,port))



    message = raw_input("-> ")
    while message != 'q':
    s.send(message)
    public_key = s.recv(1024)
    print 'Received from server: '+str(public_key)

    message = raw_input("->Press enter to verify the public key.")
    print "Public Key verified!"
    message = raw_input("-> Press enter to prepare the secret list.")
    print "Client prepares the secret list."

    secret_piece = Random.get_random_bytes(16)
    enc_data = public_key.encrypt(secret_piece, 12)
    hash_value = SHA256.new(secret_piece).digest()
    L = [enc_data, hash_value]

    print "List is ready."
    message = raw_input("-> Press enter to send the list")

    s.send(str(L))
    print "List sent."
    print "Waiting for ciphertext from the server..."

    if s.recv(1024):
    print "Ciphertext recieved."

    cipher_text = s.recv(1024)

    print "The encrypted message is: " + cipher_text
    print "The decrypted message is: " + aes.decrypt(cipher_text)




    s.close()

    Continue reading...

Compartilhe esta Página