我有一个编码为Base64的公钥。我尝试将其解码为ASN.1,我可以看到它由两部分组成:2048位整数和整数65537.我还有一个使用该公钥加密的Base64编码密文。此外,我还知道对应于密文的明文字符串,但我不确定在加密之前哪个处理(如果有的话)已应用于明文(例如,哪个字符集已用于对字符串进行编码)。
我正在寻找一种方法来确定密钥的类型,更重要的是,还有加密方法(算法,模式和填充)。我尝试使用Java进行强力(即加密和比较计算和接收的密文),假设算法是RSA,但我找不到匹配。我可能没有尝试所有组合。
我已经强行执行以下操作:
有什么想法吗?
公众看起来像RSA密钥,因此我的问题主要是尝试所有可能的(mode,padding)
组合。有没有办法迭代所有可能性?另一种可能性是在加密之前对明文应用预处理 - 任何"标准"加密前对字符串进行预处理?
答案 0 :(得分:1)
这几乎可以肯定是RSA密钥。
但是你的方法不起作用:如果用RSA加密相同的消息两次,你会得到不同的结果。那是因为RSA涉及随机填充(参见PKCS #1),这是设计安全性的要求(阻止你正在尝试的攻击) - 见脚注。
底线:假设您没有进行加密突破,您将无法使用您拥有的信息来确定其加密程度。
脚注:在开创性加密文件Probabilistic Encryption中详细说明了阻止您尝试执行的操作的安全要求。在许多要求中,他们建议即使只有一个比特被加密,你也不应该暴力(即在这种情况下同时尝试0和1)来查看哪个值加密到你捕获的密文。考虑到这些因素,建立了PKCS#1标准。
答案 1 :(得分:0)
首先,如果提供公钥,则通常与其一起提供算法(例如,作为证书内的另一个字段)。通常意图是任何客户端都能够使用公钥,因此提供算法与此目的一致。
如果由于某种原因,密钥及其元数据已经分离,您可能只需查看密钥的数据结构并找出算法。例如,任何存储为OpenSSH密钥的密钥都将跟随RFS 4523,其中包含指定算法的标头。 RSA公钥将包含指数和模数。 ECC密钥将包含两个32字节的数字。等
答案 2 :(得分:0)
您正在混合来自两种不同技术的术语。 “模式”和“填充”是指对称密码,而不是像公钥密码术那样的非对称密码。这不一定是错的,因为典型的方法是编写公钥,然后为对称密码(例如,AES)生成随机会话密钥并使用公钥对其进行加密,然后使用随机会话密钥加密明文,最后添加任何消息摘要。 (如果添加HMAC,则应使用与用于加密已修改会话密钥的密钥对不同的密钥对,它应该是密文的摘要,而不是明文。)密码和模式将以某种方式编码,但几乎可以肯定使用魔法值。 (例如,密码3,模式1),您将被要求知道如何解释这些值。
你知道是什么产生了密文吗?它是否产生了您可以在某处找到的标准格式,或者它是自制软件?
至于从密文中找出算法和模式的细节,我只能说“祝你好运”。幽灵可能有工具帮助解决这个问题,但这些密码设计用于产生看起来像随机数据的输出。除非他们使用ECB并且具有重复的明文,否则它将非常不透明。