Symmetric
使用 PyNaCl 進行簡單的密鑰加密
我正在玩 PyNaCl 以了解密碼學 atm。
現在我編寫了兩個腳本來使用密鑰加密文件,然後使用該密鑰再次解密。加密部分工作正常,但我無法再次解密文件。
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
但是,當我在 encrypt.py 中使用最後三行 decrypt.py 時,它出於某種原因起作用。但我當然不想立即解密我剛剛加密的文件,而是想稍後使用單獨的腳本來解密。
另外,我在這裡只使用 SCRYPT,因為 PyNaCl 在我的安裝中不包含 Argon2,原因不明。我也知道我將鹽硬編碼在一個變數中,這只是為了測試目的。稍後我想用 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)
任何幫助將不勝感激!
這不是一個真正的密碼學問題,但我認為如果您首先從 infile 讀取數據(框適用於數據字元串,而不是文件名),解密會更好,所以
with open(infile, 'r') as in_file: encrypted = in_file.read()
然後:
decrypted = box.decrypt(encrypted)
之前的隨機數可以去哪裡,因為它沒有被使用(加密的數據包含加密生成的鹽)。
上面的報價
"outfile"
也可以。這是一個變數。