gpt4 book ai didi

python - 如何在python中将整数转换为长度= 32字节的序列中的二进制数

转载 作者:太空宇宙 更新时间:2023-11-04 04:24:04 25 4
gpt4 key购买 nike

我想知道如何在 Python 3 中将整数转换为长度为 32 字节且最低有效位优先编码的二进制数。

我需要为我的密码学课上的练习进行这种转换。我试过 python 函数 int.to_bytes() 但它似乎不起作用...

我要转换的整数是 x = 999。

如果有帮助的话,这是我的代码:

def reading_a_pdf_file (filename):

rfile = open(filename, 'rb')
contains = rfile.read();
rfile.close();
return contains
# ...

def writing_in_a_pdf_file (filename, txt):

wfile = open(filename, 'wb')
wfile.write(txt)
wfile.close()
# ...

import nacl.secret
import nacl.utils


x= 999
key = x.to_bytes(32, byteorder='little')

# creating the box of encryption/decryption
box = nacl.secret.SecretBox(key)


# reading the encrypted file
encrypted = reading_a_pdf_file('L12-14.enc.pdf')

# we decrypt the contain of the file
decrypted = box.decrypt(encrypted)

# finally we save into a new pdf file
writing_in_a_pdf_file('L12-14.pdf', decrypted)


print("The file have been successfully decrypted in 'L12-14.pdf'")

在程序结束时,我应该得到文件 L12-14.pdf,但我得到错误:“解密失败。密文验证失败”,这意味着我的 key 不是正确的。

我知道整数是正确的,我想我在转换它时犯了一个错误。

你能帮帮我吗?

最佳答案

所以首先:欢迎来到 Lutenberger 先生的类(class),我们在这里分享一个讲座。

问题实际上是二进制数的 LSB 编码。我不会概述完整的解决方案,希望你能自己解决这个问题。如果它对我不起作用,我会解密它并可以给你进一步的提示。

因此,您有 999 作为解决方案。转换成二进制,即1111100111。但是请注意,这是在 MSB 中并且有 10 位(稍后两者都很重要)。

要做的第一件事:将数字交换为 LSB。这实质上是交换位。注意:此时,不要预先添加或附加 0 来填充字节!

现在您已经有了 LSB 中的数字,您希望在 Python 中以相反的字节顺序获得它,因为直接传递它会导致一堆 0 和最后的数据。您在这里正确使用了 byteorder=little 。然而,我们这里的数字有 10 位大,所以它跨越两个字节。因此,为了让字节和位的顺序正确并且都在我们的 32 字节流的开头,我们还必须切换所涉及的两个字节,因为第二个字节(数字的“结尾”)将是应用 byteorder=little 后的第一个。对于这一步,第二个字节必须附加 6 个 0 以在交换之前将其填满,以保持字节“分开”。

现在使用您操纵的字节流头部,将值解码为 int 并将其作为值传递给您的 x。那应该有效。提示:x 现在有 5 个数字。

旁注:请问您是如何计算 999 的?

关于python - 如何在python中将整数转换为长度= 32字节的序列中的二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com