Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate an integer for encryption from a string and vice versa

Tags:

python-3.x

rsa

I am trying to write an RSA code in python3. I need to turn user input strings (containing any characters, not only numbers) into integers to then encrypt them. What is the best way to turn a sting into an integer in Python 3.6 without 3-rd party modules?

like image 525
Ivan Gorin Avatar asked Mar 26 '26 19:03

Ivan Gorin


2 Answers

how to encode a string to an integer is far from unique... there are many ways! this is one of them:

strg = 'user input'
i = int.from_bytes(strg.encode('utf-8'), byteorder='big')

the conversion in the other direction then is:

s = int.to_bytes(i, length=len(strg), byteorder='big').decode('utf-8')

and yes, you need to know the length of the resulting string before converting back. if length is too large, the string will be padded with chr(0) from the left (with byteorder='big'); if length is too small, int.to_bytes will raise an OverflowError: int too big to convert.

like image 117
hiro protagonist Avatar answered Mar 28 '26 09:03

hiro protagonist


The @hiro protagonist's answer requires to know the length of the string. So I tried to find another solution and good answers here: Python3 convert Unicode String to int representation. I just summary here my favourite solutions:

def str2num(string):
   return int(binascii.hexlify(string.encode("utf-8")), 16)


def num2str(number):
    return binascii.unhexlify(format(number, "x").encode("utf-8")).decode("utf-8")


def numfy(s, max_code=0x110000):
    # 0x110000 is max value of unicode character
    number = 0
    for e in [ord(c) for c in s]:
        number = (number * max_code) + e
    return number


def denumfy(number, max_code=0x110000):
    l = []
    while number != 0:
        l.append(chr(number % max_code))
        number = number // max_code
    return ''.join(reversed(l))

Intersting: testing some cases shows me that

str2num(s) = numfy(s, max_code=256) if ord(s[i]) < 128

and

str2num(s) = int.from_bytes(s.encode('utf-8'), byteorder='big') (@hiro protagonist's answer)

like image 32
Vu Viet Hung Avatar answered Mar 28 '26 09:03

Vu Viet Hung



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!