【问题标题】:how to decrypt files with random nonce如何使用随机随机数解密文件
【发布时间】:2022-01-23 20:39:48
【问题描述】:

我正在使用chacha-poly1305 加密多个文件并使用 KDF 作为密码。我可以加密文件,但我如何用随机随机数解密。该函数说NEVER REUSE NONCE,然后我如何使用随机随机数进行解密。

如果我重复使用 nonce 进行文件加密,那么它有多安全。

类似的question已被询问,但解决方案并不好

例如代码

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305

kdfpass = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=5
)

password = kdfpass.derive(b'Password@123')
salt = b'123456789520'
original = b'Hellow123'

chacha = ChaCha20Poly1305(password)

encrypted = chacha.encrypt(os.urandom(12), original, salt)
print(encrypted)

decrypted = chacha.decrypt(os.urandom(12), encrypted, salt)
print(decrypted)

有没有办法保存 nonce 并检索它以进行解密。

还想知道 chacha-poly1305 是否足够好加密。

【问题讨论】:

  • 错误是什么?
  • 投票结束,因为不可复制。至于随机数警告,它说你不应该重复使用随机数使用相同的键
  • @bereal 错误是 InvalidTag
  • 当然,解密时必须使用与加密时相同的随机数。 永远不要用密钥重用 NONCE 指的是不同的加密。
  • 好吧,我不明白这个问题。在示例中,您使用不同的随机数进行加密和解密,并想知道为什么它不起作用。解决方案:使用与相关加密相同的随机数进行解密。为此,必须将(非秘密)随机数与密文(通常连接)一起传递给解密方。

标签: python encryption cryptography nonce


【解决方案1】:

在这种情况下,您使用不同的随机数进行加密和解密。在这种情况下,nonce 的目的是允许在不影响安全性的情况下重复使用密钥。

使用相同的随机数来加密和解密消息是安全的,事实上你必须这样做才能使事情正常工作。但是,您不能为多条消息重复使用相同的密钥/随机数对。这既允许篡改消息,也允许进行可泄露明文的拖拽攻击。

ChaCha20-Poly1305 被认为是强大的。但是,由于 nonce 大小较小,您不应该使用随机 nonce,因为存在冲突的风险。相反,从 CSPRNG 为每条消息生成一个随机盐,从 KDF 导出该消息的密钥和随机数,然后将盐添加到消息而不是随机数。解密时,删除盐,重新派生密钥和随机数,然后使用它们进行解密。或者,如果您有 XChaCha20-Poly1305(注意 X),那么随机数大小(192 位)足够大,可以使用随机随机数。

另外,请注意,虽然 PBKDF2 仍然安全,但作为基于密码的密钥派生函数不再被视为最先进的功能,并且首选 scrypt 或 Argon2id。此外,5 次迭代非常弱,并且您提出的代码容易受到暴力攻击,尤其是使用这种强度的密码。

【讨论】:

  • 感谢您的解释,非常感谢,密码和迭代只是快速运行它的示例,在实际代码中将迭代增加到 100k,并且可能使用 scrypt 代替 KDF
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 1970-01-01
相关资源
最近更新 更多