使用 openssl

发布时间:2021-03-08 14:02

我在尝试使用 openssl 命令解密 json 文件时遇到问题。

我有所有这些信息:

  • 密码:aes-128-ctr
  • 密码参数:
    • iv:14ba8.........c2161
    • 密文:cd1d9e5e1.....8941100
    • kdf: pbkdf2, kdfparams: { c:10240, dklen:32, prf:hmac-sha256, salt: a9e493.......5d6fb8a76 }
    • mac:2080abdb3c86.....c7b7b93

所以我尝试使用以下命令解密密文:

$ openssl enc -aes-128-ctr -d -in text_in.enc -pbkdf2 -salt -iter 10240  -iv "14ba8......c2161" -S "a9e493.......5d6fb8a76" -pass pass:<mypin> 

在 text_in.enc 文件中有密文:

$ cat text_in.enc
cd1d9e5e1.....8941100

但是当我使用 openssl 命令时,我收到“错误的幻数”错误。

$ openssl enc -aes-128-ctr -d -in text_in.enc -pbkdf2 -salt -iter 10240  -iv "14ba8......c2161" -S "a9e493.......075d6fb8a76" -pass pass:<mypin>
bad magic number

这是解密这些数据的正确方法吗?

回答1

解密模式openssl enc下的-d工具不支持在命令行提供salt。除非您指定 -nosalt,否则它希望文件以 ASCII 中的 Salted__ 幻数开头,后跟盐字节。您的密文文件一开始不包含该信息,因此出现错误。

您可以通过执行以下操作“手动”在前面添加缺少的幻数和盐字节:

$ cat <(printf Salted__) <(printf a9e493...075d6fb8a76 | xxd -r -p) text_in.enc | openssl enc -aes-128-ctr -d -iter 10240 -iv 14ba8...c2161 -pass pass:<mypin>

xxd -r 用于将您的十六进制字符串 salt 转换为字节。

请注意,使用选项 -pbkdf2 时隐含了选项 -iter,并且十六进制字符串周围不需要引号。