首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PyNaCl实现简单密钥加密

用PyNaCl实现简单密钥加密
EN

Cryptography用户
提问于 2017-08-29 18:33:25
回答 1查看 1.9K关注 0票数 2

我正在和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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

任何帮助都将不胜感激!

EN

回答 1

Cryptography用户

回答已采纳

发布于 2017-08-29 19:19:39

这并不是一个真正的密码学问题,但我认为如果您先读取幼稚的数据(方框工作在数据字符串上,而不是文件名),解密会更好,所以

代码语言:javascript
复制
with open(infile, 'r') as in_file:
    encrypted = in_file.read()

后来:

代码语言:javascript
复制
decrypted = box.decrypt(encrypted)

因为它不被使用(加密的数据包含加密产生的盐)。

同时,"outfile"上的引号也可以被删除。这是个变数。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/51191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档