- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道如何在 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/
我是一名优秀的程序员,十分优秀!