【问题标题】:Generate an integer for encryption from a string and vice versa从字符串生成用于加密的整数,反之亦然
【发布时间】:2017-11-14 05:20:33
【问题描述】:

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

【问题讨论】:

  • int('123')?或者你的意思是什么类型的字符串?
  • 用户输入的任何字符串。
  • 您是否尝试过查看 ord() 将字符转换为其 ascii 值的函数?
  • 您将字符串转换为字节序列,然后将其转换为大整数。希望您编写 RSA 是为了教育目的而不是为了使用。
  • 你能提供你的源代码吗?在我看来,这更像是一个加密问题,而不是 string->int 转换。

标签: python-3.x rsa


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这正是我所需要的!
  • 你应该知道明文的长度才能做逆向操作?
【解决方案2】:

@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) if ord(s[i])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2023-04-07
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多