最近看到这个帖子bbs.chinaflier.com/thread-273475-1-1.html,怕大家不会解密,给大家一个教程
原文:
- U2FsdGVkX1/pttf10+/ioUFT18Sgxabzdhve9LL9TNeW3KXuN6NHzeAry+lThAkj
- RpkbkxSYbA2aXOLL7zYmdnNH35wbMzG3FtyBYf9OUpY=
解密:使用Python或OpenSSL,用MD5格式,Python代码:
- import argparse
- import base64
- import hashlib
- import sys
-
-
- def evp_bytes_to_key(password: bytes, salt: bytes, key_len: int, iv_len: int):
- """OpenSSL EVP_BytesToKey: MD5 迭代派生 key 和 iv。"""
- d = b""
- prev = b""
- while len(d) < key_len + iv_len:
- prev = hashlib.md5(prev + password + salt).digest()
- d += prev
- return d[:key_len], d[key_len:key_len + iv_len]
-
-
- def openssl_decrypt(cipher_b64: str, password: str) -> str:
- """解密 OpenSSL salted 格式密文,返回明文文本。"""
- try:
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
- except ImportError:
- sys.exit("缺少依赖 cryptography,请先执行: pip install cryptography")
-
- # 1. Base64 解码
- data = base64.b64decode(cipher_b64.replace("\n", "").replace("\r", "").strip())
-
- # 2. 校验 Salted__ 魔数
- if data[:8] != b"Salted__":
- raise ValueError("不是 OpenSSL salted 格式密文(应以 U2FsdGVkX1 开头)")
-
- salt = data[8:16]
- ct = data[16:]
-
- # 3. 派生密钥与 IV
- key, iv = evp_bytes_to_key(password.encode("utf-8"), salt, 32, 16)
-
- # 4. AES-256-CBC 解密
- dec = Cipher(algorithms.AES(key), modes.CBC(iv)).decryptor()
- pt = dec.update(ct) + dec.finalize()
-
- # 5. 去除 PKCS7 填充
- pad = pt[-1]
- if pad < 1 or pad > 16:
- raise ValueError("填充校验失败:密码可能不正确")
- pt = pt[:-pad]
-
- try:
- return pt.decode("utf-8")
- except UnicodeDecodeError:
- return pt.decode("utf-8", errors="replace")
-
-
- def main():
- parser = argparse.ArgumentParser(description="OpenSSL 密文解密")
- group = parser.add_mutually_exclusive_group(required=True)
- group.add_argument("-c", "--cipher", help="Base64 密文字符串")
- group.add_argument("-f", "--file", help="密文文件路径")
- parser.add_argument("-p", "--password", required=True, help="解密密码")
- args = parser.parse_args()
-
- if args.cipher:
- cipher = args.cipher
- else:
- with open(args.file, "r", encoding="utf-8") as f:
- cipher = f.read()
-
- try:
- plain = openssl_decrypt(cipher, args.password)
- except ValueError as e:
- sys.exit(f"解密失败: {e}")
-
- print("解密成功,明文如下:")
- print("-" * 40)
- print(plain)
-
-
- if __name__ == "__main__":
- main()
复制代码
|