如何使用GPG仅生成AES加密字节,避免添加PGP额外信息?
嘿,我懂你的需求了——你想要用AES256做纯对称加密(不带PGP那些额外的头信息或元数据),这样能和用其他AES工具的朋友完成多层加密解密的交互,还不用互相透露密钥。不过得先给你提个醒:GPG的对称加密是基于PGP标准实现的,默认一定会给密文加上PGP的封装结构,哪怕你生成二进制输出,里面还是包含PGP的元数据(比如加密算法标识、校验信息等),没法直接得到纯AES加密的字节流。
下面给你两个方案,分别对应不同的场景:
方案1:用OpenSSL实现纯AES256对称加密(推荐,满足跨工具交互需求)
OpenSSL可以直接生成纯AES加密的字节流,没有任何额外封装,完美契合你和朋友跨工具协作的需求。以下是对应你4步流程的具体命令:
先准备原始文件
echo "sometext" > file_original.txt
步骤1:用keyA加密原始文件得到file_keyA.txt
AES加密需要初始化向量(IV)来保证加密安全性,这里我们把IV直接放在密文文件的开头,方便解密时读取:
# 生成16字节的随机IV(AES块大小固定为16字节) IV=$(openssl rand -hex 16) # 把明文密钥keyA转换成256位的十六进制密钥(AES256需要32字节密钥),然后加密 openssl enc -aes-256-cbc -K $(echo -n "keyA" | sha256sum | head -c 64) -iv $IV -in file_original.txt -out file_keyA.txt # 将IV写入密文文件的开头(解密时先提取IV) echo -n $IV | xxd -r -p | cat - file_keyA.txt > temp && mv temp file_keyA.txt
步骤2:用keyB加密file_keyA.txt得到file_keyA_keyB.txt
和步骤1逻辑一致,用keyB再次加密:
IV=$(openssl rand -hex 16) openssl enc -aes-256-cbc -K $(echo -n "keyB" | sha256sum | head -c 64) -iv $IV -in file_keyA.txt -out file_keyA_keyB.txt echo -n $IV | xxd -r -p | cat - file_keyA_keyB.txt > temp && mv temp file_keyA_keyB.txt
步骤3:用keyA解密file_keyA_keyB.txt得到file_keyB.txt
先提取开头的16字节IV,再用keyA解密:
# 提取密文开头的16字节IV IV=$(head -c 16 file_keyA_keyB.txt | xxd -p) # 截取密文部分(去掉开头的IV) tail -c +17 file_keyA_keyB.txt > temp_cipher # 解密得到file_keyB.txt openssl enc -d -aes-256-cbc -K $(echo -n "keyA" | sha256sum | head -c 64) -iv $IV -in temp_cipher -out file_keyB.txt rm temp_cipher
步骤4:用keyB解密file_keyB.txt还原原始文件
同样先提取IV再解密:
IV=$(head -c 16 file_keyB.txt | xxd -p) tail -c +17 file_keyB.txt > temp_cipher openssl enc -d -aes-256-cbc -K $(echo -n "keyB" | sha256sum | head -c 64) -iv $IV -in temp_cipher -out file_restored.txt rm temp_cipher # 验证还原结果 cat file_restored.txt # 这里应该输出sometext
这个方案生成的完全是纯AES加密字节,没有任何额外封装,你的朋友用任何支持AES256-CBC的工具都能配合完成操作。
方案2:用GPG实现多层加密(仅适合GPG内部交互,无法跨工具)
如果你一定要用GPG,那只能接受PGP的封装结构,因为GPG本质是PGP工具,没法输出纯AES字节。不过你可以去掉ASCII装甲,生成二进制PGP密文,命令如下:
步骤1:用keyA加密原始文件
gpg --cipher-algo AES256 --symmetric --no-armor --passphrase "keyA" --output file_keyA.gpg file_original.txt
参数说明:--no-armor生成二进制PGP密文,--passphrase直接指定密钥(避免交互输入)。
步骤2:用keyB加密file_keyA.gpg
gpg --cipher-algo AES256 --symmetric --no-armor --passphrase "keyB" --output file_keyA_keyB.gpg file_keyA.gpg
步骤3:用keyA解密file_keyA_keyB.gpg
gpg --decrypt --passphrase "keyA" --output file_keyB.gpg file_keyA_keyB.gpg
步骤4:用keyB解密还原原始文件
gpg --decrypt --passphrase "keyB" --output file_restored.txt file_keyB.gpg # 验证结果 cat file_restored.txt # 输出sometext
注意:这个方案生成的.gpg文件是PGP格式的二进制文件,包含PGP元数据,你的朋友如果用非GPG的AES工具,是没法直接解密的。所以如果要和其他AES工具交互,还是方案1更合适。
内容的提问来源于stack exchange,提问作者Giorgio Napolitano

