You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从公钥、密文及对应明文判断加密算法类型

判断加密算法类型的方法

首先,从你描述的公钥特征来看,几乎可以确定是RSA加密算法——因为ASN.1解码后得到的2048位整数(模数n)和整数65537(公钥指数e)是RSA公钥的标志性结构,65537也是RSA中最常用的安全指数之一。

接下来可以通过你手头的明文、密文来验证并补全细节(比如明文的字符集编码、RSA的填充模式),具体步骤如下:

  • 第一步:锁定候选算法
    非对称加密算法里,只有RSA的公钥是由(n, e)两个大整数组成的。像ECC(椭圆曲线加密)的公钥是曲线上的一个点(包含x、y坐标),DSA/ECDSA是签名算法而非加密算法,它们的公钥结构都和你描述的完全不符,所以可以直接排除这些可能性。

  • 第二步:验证RSA的具体参数(字符集+填充模式)
    RSA加密不能直接对明文裸加密,必须配合填充模式,同时明文需要先转成字节数组(这就涉及到字符集编码)。你可以通过模拟加密流程来匹配:

    1. 尝试将明文用不同的字符集编码为字节串,常见的有UTF-8ASCIIUTF-16LEGBK等——如果明文包含非ASCII字符,UTF-8或对应地区编码(比如GBK)的概率更高。
    2. 用你的公钥对编码后的字节串尝试不同的RSA填充模式:
      • PKCS#1 v1.5:传统填充方式,兼容性好,很多旧系统使用
      • OAEP:更安全的填充,通常搭配SHA哈希算法(如SHA-1、SHA-256)
    3. 将加密后的结果转成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

火山引擎 最新活动