如何在python

时间:2018-12-19 12:57:45

标签: python python-3.x

我想知道如何在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,但出现错误:“解密失败。密文验证失败”,这意味着我的密钥不是一个好的密钥。

据我所知整数是正确的,我想我在将其转换时犯了一个错误。

你能帮我吗?

1 个答案:

答案 0 :(得分:1)

因此,首先:欢迎来到卢滕贝格先生的课程,我们在这里分享演讲。

问题实际上是二进制数的LSB编码。 我不会概述完整的解决方案,希望您可以自己解决。如果对我不起作用,我将其解密,可以为您提供进一步的提示。

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

首先要做的是:将数字交换为LSB。这实际上是交换位。注意:此时,请勿在前面添加或添加0来填充字节!

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

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

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

相关问题