我正在和PyNaCl玩游戏,以便对密码技术有所了解。
现在,我编写了两个脚本,用一个秘密密钥加密一个文件,然后使用该密钥再次解密它。加密部分工作正常,但我在再次解密文件时遇到了问题。我在执行nacl.exceptions.ValueError: The nonce must be exactly 24 bytes long时得到错误decrypt.py。当我显式地将在decrypt.py中生成的nonce传递给decrypt()函数时,我得到了错误nacl.exceptions.CryptoError: Decryption failed. Ciphertext failed verification
然而,当我在decrypt.py中使用encrypt.py的最后三行时,由于某种原因,它可以工作。但当然,我不想立即解密我刚刚加密的文件,相反,我想在以后用一个单独的脚本进行解密。
此外,我在这里只使用SCRYPT,因为PyNaCl在我的安装中不包含Argon2,原因不明。我还知道,我在一个变量中硬编码了salt,这只是为了测试目的。稍后,我想用utils.random生成它,并将它写入加密的文件。
我的脚本看起来如下:
encrypt.py
from nacl import pwhash, secret, utils
password = b'lala'
infile = "test.mp4"
outfile = "out.crypt"
kdf = pwhash.kdf_scryptsalsa208sha256
salt = '\x1b\r\xbfxrL\xee\x83x\x0b\x83\x13O\x1dv\xbc\xd5\x13\x18w;G\xd6\x88 \xae\x8b\x96^\xbd4\xbc'
ops = 33554432
mem = pwhash.SCRYPT_MEMLIMIT_SENSITIVE
with open(infile, "rb") as in_file:
data = in_file.read()
derivatedKey = kdf(secret.SecretBox.KEY_SIZE, password, salt,
opslimit=ops, memlimit=mem)
secretBox = secret.SecretBox(derivatedKey)
nonce = utils.random(secret.SecretBox.NONCE_SIZE)
encrypted = secretBox.encrypt(data, nonce)
with open(outfile, "wb") as out_file:
out_file.write(encrypted)decrypt.py
from nacl import pwhash, secret, utils
password = b"lala"
infile = "out.crypt"
outfile = "decrypted.mp4"
kdf = pwhash.kdf_scryptsalsa208sha256
salt = '\x1b\r\xbfxrL\xee\x83x\x0b\x83\x13O\x1dv\xbc\xd5\x13\x18w;G\xd6\x88 \xae\x8b\x96^\xbd4\xbc'
ops = 33554432
mem = pwhash.SCRYPT_MEMLIMIT_SENSITIVE
key = kdf(secret.SecretBox.KEY_SIZE, password, salt,
opslimit=ops, memlimit=mem)
box = secret.SecretBox(key)
nonce = utils.random(secret.SecretBox.NONCE_SIZE)
decrypted = box.decrypt(infile)
with open("outfile", "wb") as out_file:
out_file.write(decrypted)任何帮助都将不胜感激!
发布于 2017-08-29 19:19:39
这并不是一个真正的密码学问题,但我认为如果您先读取幼稚的数据(方框工作在数据字符串上,而不是文件名),解密会更好,所以
with open(infile, 'r') as in_file:
encrypted = in_file.read()后来:
decrypted = box.decrypt(encrypted)因为它不被使用(加密的数据包含加密产生的盐)。
同时,"outfile"上的引号也可以被删除。这是个变数。
https://crypto.stackexchange.com/questions/51191
复制相似问题