这与我在这个问题中所做的相反 -https://crypto.stackexchange.com/questions/21021/encryption-and-hmac-in-a-pskc-file
规格如下:https://tools.ietf.org/rfc/rfc6030.txt
数据/种子使用 AES-128-CBC 和密钥及 IV 进行加密。IV 附加在加密数据前面,整个数据采用 base-64 编码并存储在 CipherValue 字段中。
我有(这是来自我拥有的示例 pskc 文件,而不是来自 RFC)。
CipherValue/EncryptedText = v5dgOiUq1Hgja0g1SI9VpcHu81DLdcDqT8C3+k8wlQtk5KL1KErwojxLPSNO8lZt
Encryption Key = E9C1E401122EE194D620465A775D9C97
Algo = AES-128-CBC
我需要从中获取解密数据
这就是我正在做的事情
我将 CipherValue 存储在名为 cv 的文件中。
openssl base64 -d -A < cv > cv.bin
我得到一个 48 字节的 cv.bin
我分成了两部分
iv.bin = 16 bytes
data.bin = 32 bytes
我将 iv.bin 转换为十六进制
xxd -p < iv.bin
bf97603a252ad478236b4835488f55a5
所以我的
iv = bf97603a252ad478236b4835488f55a5
我将密钥转换为十六进制
我有一个名为 k.b64 的文件,其中包含E9C1E401122EE194D620465A775D9C97
openssl base64 -d -A < k.b64 > k.bin
xxd -p < k.bin
13d0b5138d35d76d84135f780fadb4e3ae40efbe43f42f7b
key = 13d0b5138d35d76d84135f780fadb4e3ae40efbe43f42f7b
现在我解密
openssl enc -aes-128-cbc -d -K 13d0b5138d35d76d84135f780fadb4e3ae40efbe43f42f7b -iv bf97603a252ad478236b4835488f55a5 < data.bin
我收到以下错误
▓\=Bt═┐|)éïh│■ìcbad decrypt
62008:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:.
\crypto\evp\evp_enc.c:539:
我在这里做错了什么?
答案1
(根据评论回答,重新组织成符合逻辑的顺序。)
本例中的加密密钥值为E9C1E401122EE194D620465A775D9C97
32 个字符,这些字符是有效的十六进制数字,本质上也是有效的 base64 字符。通常,应该从创建(或发送)数据的进程中了解数据的编码。
此值为不太可能之所以使用 base64,是因为除非刻意设计,否则超过几个字节的 base64 编码几乎总是会包含一些非十六进制数字的字符。不可能的为 base64,因为 32 个 base64 字符不使用 base64 填充(=
)编码一个 24 字节的值,但我们知道该值是一个 16 字节的 AES-128 密钥。
因此,该密钥是十六进制编码的,将其提供给openssl enc -K
需要十六进制解密的人即可正确解密。