如何在终端使用Openssl通过XChaCha20Poly1305对文件执行加解密操作
实现XChaCha20Poly1305文件加解密的方法
首先明确:你之前用的openssl enc命令不直接支持XChaCha20Poly1305这类带认证的AEAD算法,enc工具没有内置处理AEAD认证标签、扩展nonce的逻辑,所以需要换用OpenSSL的pkeyutl命令配合EVP_PKEY接口实现,操作步骤如下:
前置要求
你的OpenSSL版本需要高于等于1.1.1,可执行openssl version验证版本。
加密命令
# 生成24字节随机nonce(XChaCha20标准要求nonce长度为24字节) openssl rand -out nonce.bin 24 # 执行加密,生成密文和16字节认证标签 openssl pkeyutl -encrypt -inkey <(echo -n "你的加密密码") -keyform raw -pkeyopt cipher:xchacha20-poly1305 -pkeyopt iv:$(xxd -p nonce.bin | tr -d '\n') -pkeyopt taglen:16 -in 待加密的明文文件路径 -out 密文数据.bin -pkeyopt md:sha512 -pkeyopt iter:700 -salt # 把nonce、认证标签、密文拼接成最终输出文件,方便解密时直接读取 cat nonce.bin <(openssl pkeyutl -get-parameter tag -in 密文数据.bin) 密文数据.bin > 最终加密后的输出文件 # 清理临时文件 rm nonce.bin 密文数据.bin
如果你需要和之前一样输出base64编码的结果,可以在最后加一步:
base64 最终加密后的输出文件 > 最终加密后的base64格式文件
小提示:如果你担心命令行里直接输入密码会被记录到shell历史或者进程列表,可以把密码写入一个权限为600的临时文件,把命令里的
<(echo -n "你的加密密码")替换为临时文件路径,加密/解密完成后删掉临时文件即可。
解密命令
如果你的密文是base64编码的,先解码:
base64 -d 加密的base64文件 > 密文二进制文件
然后执行解密:
# 从密文头部拆分出24字节nonce、16字节认证标签,剩下的是密文主体 head -c 24 密文二进制文件 > nonce.bin tail -c +25 密文二进制文件 | head -c 16 > tag.bin tail -c +41 密文二进制文件 > 密文主体.bin # 执行解密,验证标签的同时解出明文 openssl pkeyutl -decrypt -inkey <(echo -n "你的加密密码") -keyform raw -pkeyopt cipher:xchacha20-poly1305 -pkeyopt iv:$(xxd -p nonce.bin | tr -d '\n') -pkeyopt tag:$(xxd -p tag.bin | tr -d '\n') -pkeyopt md:sha512 -pkeyopt iter:700 -salt -in 密文主体.bin -out 解密后的明文文件 # 清理临时文件 rm nonce.bin tag.bin 密文主体.bin
参数说明
所有参数和你之前用的chacha20命令参数保持对齐:
- iter 700:密钥派生迭代次数和之前一致
- md sha512:密钥派生哈希算法和之前一致
- salt:默认开启加盐,和之前逻辑一致
- 所有密码派生逻辑和你原有流程兼容,不需要调整原有密码设置习惯
内容的提问来源于stack exchange,提问作者SAVIO PRINCE
相关产品推荐
相关产品推荐

