openssl genrsa的AES-128-CBC模式密钥是什么?Python解密遇阻求助
OpenSSL AES-CBC加密私钥解密问题修复
你之前的脚本错误在于直接把密码当作AES密钥使用,但OpenSSL生成加密私钥时,是通过PBKDF2算法从密码派生密钥和IV的,而非直接用原始密码。同时你截取的密文片段也不符合OpenSSL的加密结构,导致无法得到MIIE开头的正确私钥。
OpenSSL加密私钥的结构
OpenSSL加密的PEM私钥解码后由三部分组成:
- 8字节固定前缀:
Salted__ - 8字节盐值
- AES-CBC加密后的私钥数据(带PKCS#7填充)
正确的Python解密代码
from base64 import b64decode, b64encode from Crypto.Cipher import AES from Crypto.Protocol.KDF import PBKDF2 from Crypto.Hash import SHA256 from Crypto.Util.Padding import unpad import textwrap # 替换为你的完整PEM加密私钥内容 encrypted_pem = """-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,4F6CAB2522DE70629D6DABB100908030 FJsww7LryZQFxKnP9TRHoSXNn7OP1/Dsq7vJNiB/I8GUgHxwb2s1dEwSHR0KBD4S # 补充完整的base64行 -----END RSA PRIVATE KEY-----""" # 提取并解码加密数据 # 过滤掉PEM标记头、Proc-Type和DEK-Info行,合并剩余base64内容 raw_base64 = ''.join([ line.strip() for line in encrypted_pem.split('\n') if not line.startswith(('-----', 'Proc-Type', 'DEK-Info')) ]) encrypted_data = b64decode(raw_base64) # 解析盐值:前8字节是"Salted__",取接下来8字节作为盐 salt = encrypted_data[8:16] ciphertext = encrypted_data[16:] # 用PBKDF2派生AES密钥和IV(OpenSSL默认参数:迭代10000次,SHA256哈希) password = b"qwerty0123456789" # 派生16字节密钥+16字节IV,总共32字节 key_iv = PBKDF2(password, salt, dkLen=32, count=10000, hmac_hash_module=SHA256) aes_key = key_iv[:16] aes_iv = key_iv[16:] # AES-CBC解密并去除PKCS#7填充 cipher = AES.new(aes_key, AES.MODE_CBC, aes_iv) decrypted_der = unpad(cipher.decrypt(ciphertext), AES.block_size) # 转换为标准PEM格式的未加密私钥 b64_der = b64encode(decrypted_der).decode() formatted_pem = f"-----BEGIN RSA PRIVATE KEY-----\n{textwrap.fill(b64_der, 64)}\n-----END RSA PRIVATE KEY-----" print(formatted_pem)
原脚本的核心错误
- 密钥使用错误:OpenSSL不会直接用密码作为AES密钥,必须通过PBKDF2结合盐值派生
- 密文处理错误:只截取了16字节数据,没有处理完整的加密内容和盐值
- 缺失填充处理:解密后没有去除PKCS#7填充,导致结果不正确
内容的提问来源于stack exchange,提问作者Thanh
相关产品推荐
相关产品推荐

