从字符串生成用于加密的整数,反之亦然
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主角的回答)
我正在尝试在 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主角的回答)