Symmetric

使用 PyNaCl 進行簡單的密鑰加密

  • August 29, 2017

我正在玩 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"也可以。這是一個變數。

引用自:https://crypto.stackexchange.com/questions/51191