当前位置: 首页 > 知识库问答 >
问题:

pycrypto加密/解密,解密时丢失部分加密字符串

东方新霁
2023-03-14

我正在尝试用python中的pycrypto加密/解密。在大多数情况下,事情进展顺利,但在解密数据时,我遇到了一个奇怪的问题。我尝试对一些JPG进行加密/解密以进行测试,尽管它们加密/解密没有问题,但解密的文件无法打开/已损坏。为了找到问题,我保存了一个文本文件,其中有一个类似于“测试这个文件的完整性”之类的随机句子,它只有在“…完整性”之类的内容之后才能正确解密,完整性之前的所有内容仍然是乱码。我对AES不太了解,但我假设这是一个编码/解码或填充错误。

这是我的密码:

#encryption
iv = Random.new().read( AES.block_size)

filePath = input("Path to file for encryption: ")
selFile = open(filePath, 'rb')
getBytes = bytes(selFile.read())

encPW = input("Enter password: ")
hashpw = hashlib.sha256(encPW.encode('UTF-8').digest())

destination = input("Destination path for encrypted file: ")

aes = AES.new(hashpw, AES.Mode_CFB, iv)
encFile = base65.b64encode(aes.encrypt(getBytes))

writetofile = open(destination, 'wb')
writetofile.write(encFile)
writetofile.close()
print("Encryption successful")

#Decryption
iv = Random.new().read( AES.block_size)

filePath = input("Path to file for decryption: ")
selFile = open(filePath, 'rb')
getBytes = bytes(selFile.read())

decPW = input("Enter password: ")
hashdecpw = hashlib.sha256(encPW.encode('UTF-8').digest())

destination = input("Destination path for decrypted file: ")

aes = AES.new(hashdecpw, AES.Mode_CFB, iv)
decFile = aes.decrypt(getBytes)

writetofile = open(destination, 'wb')
writetofile.write(decFile)
writetofile.close()
print("Decryption successful")

有什么想法可能会导致第一个字符的丢失,并阻止我正确加密/解密文件?

共有2个答案

堵宪
2023-03-14

您正在分别为加密和解密生成一个新的IV,这会产生这样的问题。以下是我的建议:

def encrypt(inpath, outpath, password):
    iv = Random.new().read(AES.block_size)
    with open(inpath, "rb") as f:
        contents = f.read()
    # A context manager automatically calls f.close()
    key = pbkdf2.crypt(password, "")
    # See notes

    aes = AES.new(key, AES.Mode_CFB, iv)
    encrypted = aes.encrypt(contents)
    with open(outpath, "wb") as f:
        f.write(iv + b":")
        f.write(encrypted)
    print("Encryption successful")


def decrypt(inpath, outpath, password):
    with open(inpath, "rb") as f:
        contents = f.read()

    iv, encrypted = contents.split(b":")
    key = pbkdf2.crypt(password, "")
    aes = AES.new(key, AES.Mode_CFB, iv)

    decrypted = aes.decrypt(contents)
    with open(outpath, "wb") as f:
        f.write(decrypted)
    print("Decryption successful")

一些注意事项:

>

哈希算法不足以派生密钥,这就是为什么有称为密钥派生算法的特殊工具(如python中的PBKDF2)。用那些来代替!

我自己没有测试过这个代码,所以它可能无法正常工作。

颛孙星海
2023-03-14

您至少有三个问题:

>

  • 您可能是指hashlib。sha256(加密编码('UTF-8'))。摘要()而不是hashlib。sha256(encPW.encode('UTF-8').digest())(右括号位于错误位置)

    在将密文写入文件之前,您使用Base64对密文进行编码。在解密之前,您已经忘记从文件中读取它。例如:

    getBytes = base64.b64decode(bytes(selFile.read()))
    

    这是一个大问题:在解密过程中,您需要与用于加密的完全相同的IV。IV不是秘密,但对于使用相同密钥进行的每一次加密,它都必须是唯一的。通常,IV写在密文前面,然后读回进行解密。

    #encryption
    encFile = base64.b64encode(iv + aes.encrypt(getBytes))
    
    #decryption
    getBytes = base64.b64decode(bytes(selFile.read()))
    iv = getBytes[:16]
    aes = AES.new(hashdecpw, AES.Mode_CFB, iv)
    decFile = aes.decrypt(getBytes[16:])
    

  •  类似资料:
    • 问题内容: 我正在尝试使用PyCrypto构建两个接受两个参数的函数:消息和密钥,然后对消息进行加密/解密。 我在网络上找到了几个链接可以帮助我,但是每个链接都有缺陷: 在codekoala上的此代码使用了os.urandom,PyCrypto不建议这样做。 此外,我不能保证给函数的键具有预期的确切长度。我该怎么做才能做到这一点? 另外,有几种模式,推荐哪种?我不知道该怎么用:/ 最后,IV到底是

    • 我试图使用PyCrypto构建两个函数,它们接受两个参数:消息和密钥,然后加密/解密消息。 我在网上找到了几个帮助我的链接,但每一个都有缺陷: 编辑:删除了代码部分,因为它不安全。

    • 我感兴趣的是构建一个个人使用的小应用程序,它将使用JavaScript在客户端加密和解密信息。加密的信息将存储在服务器上的数据库中,但不会存储解密的版本。 它不一定要是超级duper安全的,但我想使用一个当前未中断的算法。 理想情况下我可以做一些 生成编码字符串,以及类似于 以后再解码。 到目前为止,我已经看到了以下内容:http://bitwiseshiftleft.github.io/sjcl

    • 我尝试在服务器上进行gpg加密/解密,对于加密,我使用以下命令行: 我想要找到原因:同一个用户有2个不同的密钥和1个秘密密钥。但现在又出现了一个问题:我删除了错误的键,并再次进行相同的测试。 解密后的答案是: 您需要一个密码短语来解锁用户的密钥:“Droli Mail_Adress”2048位RSA密钥,ID 6D2F1BE9,创建2017-07-19(主密钥ID 09C41BAC) 没有关于gp

    • 因此,这种特殊的异常非常常见,但我的问题与通常被问到的略有不同。 我有一个AES解密和加密函数,定义如下: 现在,如果我像这样执行单个解密: 字节数组输出很好。而如果我执行双重加密/解密: 我得到了著名的<code>javax.crypto。BadPaddingException:给定的最终块未正确填充异常。请注意,和只是整数(假设它们都是0)。目前,IVBytes只是一个大小为16的空字节数组,

    • 问题内容: 我是密码学的新手。我希望学习如何在文件中加密和解密文本……当我在net中引用相关文章时。我怀疑对同一文本进行多次加密后,单个文本的加密文本是否会相同?谁能解决我的疑问? 问题答案: 这是使用该类的示例: