根据 public 密钥和密文确定加密方法

Determining encryption method from public key and cipher text

我有一个 public 编码为 Base64 的密钥。我尝试将它解码为 ASN.1,我可以看到它由两部分组成:一个 2048 位整数和一个整数 65537。我还有一个使用 public 密钥加密的 Base64 编码密文。此外,我也知道与密文相对应的明文字符串,但我不确定在加密之前对明文应用了哪些处理(如果有的话)(例如,使用哪个字符集对字符串进行编码)。

我正在寻找一种方法来确定密钥的类型,更重要的是,确定加密方法(算法、模式和填充)。我尝试使用 Java 的蛮力(即加密和比较计算和接收的密文),假设算法是 RSA,但我无法找到匹配项。我可能没有尝试所有组合。

我已经在暴力破解以下内容:

有什么想法吗?


public 看起来像一个 RSA 密钥,因此我的问题主要是尝试所有可能的 (mode,padding) 组合。有没有办法迭代所有的可能性?另一种可能性是在加密之前对明文进行预处理 - 在加密之前对字符串进行任何 "standard" 预处理?

首先,如果提供了 public 密钥,则算法通常会与其一起提供(例如,作为证书中的另一个字段)。通常目的是让任何客户端都能够使用 public 密钥,因此提供的算法与该目的一致。

如果由于某种原因密钥及其元数据已分离,您可能只需查看密钥的数据结构并找出算法即可。例如,任何存储为 OpenSSH 密钥的密钥都将遵循 RFS 4523,其中包括指定算法的 header。 RSA public 密钥将包含指数和模数。 ECC 密钥将包含两个 32 字节的数字。等等

您正在混合使用两种不同技术的术语。 "Mode" 和 "padding" 指的是对称密码,而不是像 public 密钥加密那样的非对称密码。这不一定是错误的,因为典型的方法是编写 public 密钥,然后为对称密码(例如 AES)生成一个随机会话密钥并使用 public 密钥对其进行加密,然后对明文进行加密使用随机会话密钥,然后最后添加任何消息摘要。 (如果你添加一个 HMAC,你应该使用不同的密钥对,而不是用于加密修改后的会话密钥的密钥对,它应该是密文的摘要,而不是明文。)密码和模式将以某种方式编码,但几乎可以肯定使用魔法值。 (例如,密码 3,模式 1)并且您需要知道如何解释这些值。

你知道密文是怎么产生的吗?它会产生一种标准格式,您可以在某处找到记录,还是自制软件?

至于仅从密文中找出算法和模式的细节,我只能说"good luck"。间谍可能有工具来帮助解决这个问题,但这些密码旨在产生看起来像随机数据的输出。除非他们使用 ECB 并重复明文,否则它将非常不透明。

几乎可以肯定这是一个 RSA 密钥。

但是你的方法行不通:如果你用RSA对同一条消息加密两次,你会得到不同的结果。这是因为 RSA 涉及随机填充(参见 PKCS #1),这是设计安全性的要求(以阻止您正在尝试的攻击)——参见脚注。

底线:假设您没有在密码学上取得突破,您将无法判断它是如何用您所拥有的信息加密的。

脚注:在开创性的加密论文 Probabilistic Encryption 中详细介绍了阻止您尝试执行操作的安全要求。在许多要求中,他们建议即使只有一个位被加密,你也不应该能够蛮力(即在这种情况下尝试 0 和 1)来查看哪个值加密为你捕获的密文。 PKCS #1 标准是在考虑这些因素的情况下构建的。