如何从公钥、密文及对应明文判断加密算法类型
判断加密算法类型的方法
首先,从你描述的公钥特征来看,几乎可以确定是RSA加密算法——因为ASN.1解码后得到的2048位整数(模数n)和整数65537(公钥指数e)是RSA公钥的标志性结构,65537也是RSA中最常用的安全指数之一。
接下来可以通过你手头的明文、密文来验证并补全细节(比如明文的字符集编码、RSA的填充模式),具体步骤如下:
第一步:锁定候选算法
非对称加密算法里,只有RSA的公钥是由(n, e)两个大整数组成的。像ECC(椭圆曲线加密)的公钥是曲线上的一个点(包含x、y坐标),DSA/ECDSA是签名算法而非加密算法,它们的公钥结构都和你描述的完全不符,所以可以直接排除这些可能性。第二步:验证RSA的具体参数(字符集+填充模式)
RSA加密不能直接对明文裸加密,必须配合填充模式,同时明文需要先转成字节数组(这就涉及到字符集编码)。你可以通过模拟加密流程来匹配:- 尝试将明文用不同的字符集编码为字节串,常见的有
UTF-8、ASCII、UTF-16LE、GBK等——如果明文包含非ASCII字符,UTF-8或对应地区编码(比如GBK)的概率更高。 - 用你的公钥对编码后的字节串尝试不同的RSA填充模式:
PKCS#1 v1.5:传统填充方式,兼容性好,很多旧系统使用OAEP:更安全的填充,通常搭配SHA哈希算法(如SHA-1、SHA-256)
- 将加密后的结果转成Base64,和你现有的密文对比,完全匹配的组合就是正确的预处理和加密参数。
- 尝试将明文用不同的字符集编码为字节串,常见的有
第三步:代码示例验证
用Python的cryptography库可以快速验证,示例代码如下:from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import padding import base64 # 替换成你的实际数据 base64_pub_key = "你的Base64公钥字符串" known_plaintext = "已知的明文内容" ciphertext_b64 = "加密后的Base64密文" # 加载RSA公钥 pub_key_bytes = base64.b64decode(base64_pub_key) # 如果公钥是PEM格式(带-----BEGIN PUBLIC KEY-----头),改用load_pem_public_key public_key = serialization.load_der_public_key(pub_key_bytes) # 待测试的字符集和填充方案 test_charsets = ["utf-8", "ascii", "utf-16le", "gbk", "utf-16be"] test_paddings = [ padding.PKCS1v15(), padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(), label=None ), padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ] for charset in test_charsets: try: plain_bytes = known_plaintext.encode(charset) except UnicodeEncodeError: continue # 该字符集无法编码明文,跳过 for pad in test_paddings: try: # 模拟加密 encrypted_bytes = public_key.encrypt(plain_bytes, pad) encrypted_b64 = base64.b64encode(encrypted_bytes).decode("utf-8") if encrypted_b64 == ciphertext_b64: print(f"✅ 匹配成功!") print(f"加密算法:RSA") print(f"明文编码字符集:{charset}") print(f"填充模式:{pad.__class__.__name__}(具体参数见代码)") exit() except ValueError: # 填充不兼容(比如明文长度超过密钥允许的最大长度),跳过 continue print("❌ 未找到匹配的组合,请尝试更多字符集或填充模式")
内容的提问来源于stack exchange,提问作者manash




