3

I'm using Python 3 and Python-rsa (https://stuvel.eu/rsa) and I keep getting the same error when encrypting a message:

> Traceback (most recent call last):
``File "client.py", line 65, in <module>
msgg = encrypt_text(pubkey, msg)
File "client.py", line 54, in encrypt_text
return rsa.encrypt(msg.encode(), pubkey)
File "C:\Users\N0t_an_admin\AppData\Local\Programs\Python\Python36-32\lib\s
-packages\rsa\pkcs1.py", line 170, in encrypt
padded = _pad_for_encryption(message, keylength)
File "C:\Users\N0t_an_admin\AppData\Local\Programs\Python\Python36-32\lib\s
-packages\rsa\pkcs1.py", line 87, in _pad_for_encryption
' space for %i' % (msglength, max_msglength))
OverflowError: 1 bytes needed for message, but there is only space for -10

Code:

def get_server_pub():
    pubkey = listener("serverpub").decode("utf-8")
    pubkey = pubkey.strip(";")
    xd = rsa.PublicKey(n= int(pubkey[0]), e= int(pubkey[1]))
    return xd

def encrypt_text(pubkey, msg):
    return rsa.encrypt(msg.encode(), pubkey)


if __name__ == '__main__':
    print("Hello")
    if os.path.isfile('ckeys.json') == False:
        keys = createkeys()
        write_to_json_file('ckeys.json', keys)
    pubkey = get_server_pub()
    while True:
        msg = input("Message: ")
        msgg = encrypt_text(pubkey, msg)
        recived = listener(msgg)
        if not recived:
            continue
        print(recived)

The documentation says:

OverflowError – when the message is too large to fit in the padded block.

2
  • What do you use as Message? Commented Apr 5, 2018 at 16:52
  • @Alfabravo a string. From msg = input("Message: ") Commented Apr 5, 2018 at 16:55

1 Answer 1

1

Checking the code for that library, the section to blame is this one

def _pad_for_encryption(message, target_length):
    r"""Pads the message for encryption, returning the padded message.
    :return: 00 02 RANDOM_DATA 00 MESSAGE
    >>> block = _pad_for_encryption(b'hello', 16)
    >>> len(block)
    16
    >>> block[0:2]
    b'\x00\x02'
    >>> block[-6:]
    b'\x00hello'
    """

    max_msglength = target_length - 11
    msglength = len(message)

    if msglength > max_msglength:
        raise OverflowError('%i bytes needed for message, but there is only'
' space for %i' % (msglength, max_msglength))

And that method is called here

keylength = common.byte_size(pub_key.n)
padded = _pad_for_encryption(message, keylength)

It seems that the key length is being calculated incorrectly, so the maxlength is -10. Check that you are getting the public key.

Sign up to request clarification or add additional context in comments.

1 Comment

Yeah you're right, I wasn't getting the publickey in the correct way because I was using pubkey = pubkey.strip(";") instead of pubkey = pubkey.split(";")

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.