从字符串生成用于加密的整数,反之亦然

Generate an integer for encryption from a string and vice versa

我正在尝试在 python3 中编写 RSA 代码。我需要将用户输入的字符串(包含任何字符,而不仅仅是数字)转换为整数,然后对其进行加密。在没有第 3 方模块的情况下,在 Python 3.6 中将字符串转换为整数的最佳方法是什么?

如何将字符串编码为整数远非唯一...有很多方法!这是其中之一:

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

那么反方向的转换就是:

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

是的,您需要在转换回之前知道结果字符串的长度。如果 length 太大,字符串将从左边用 chr(0) 填充(用 byteorder='big');如果 length 太小,int.to_bytes 将引发 OverflowError: int too big to convert.

@hiro 主角的回答需要知道字符串的长度。所以我试图在这里找到另一个解决方案和好的答案:Python3 convert Unicode String to int representation。我只是在这里总结我最喜欢的解决方案:

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))

有趣:测试一些案例表明

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

str2num(s) = int.from_bytes(s.encode('utf-8'), byteorder='big') (@hiro主角的回答)