【问题标题】:Is there a way to decrypt an encoded string without a key in Ruby?有没有办法在 Ruby 中解密没有密钥的编码字符串?
【发布时间】:2019-04-26 18:21:13
【问题描述】:

问题来了,一个字符串按以下顺序通过了三个单独的加密:原始 -> Base64 -> AES-256 -> Blowfish (Keyless) -> 最终。编写一个方法,将这个三重编码字符串 mystery_string = "OXbVgH7UriGqmRZcqOXUOvJt8Q4JKn5MwD1XP8bg9yHwhssYAKfWE+AMpr25HruA" 完全解密为原始状态。

我查看了 aes256 和河豚的不同库/文档,但它们都需要密钥。唯一不需要密钥的是 Base64(即 Base64.encode64('some string') )。不太确定从这里去哪里。

【问题讨论】:

  • 您对问题的陈述并不是说您不知道 AES-256 和 Blowfish 的密钥。我认为没有这些密钥就无法解密。你确定你不知道这两个键吗?
  • 是的。这就是我掌握的所有信息。我能够使用这个site 解码编码的字符串。这是它是如何分解的。 blowfish_str = "OXbVgH7UriGqmRZcqOXUOvJt8Q4JKn5MwD1XP8bg9yHwhssYAKfWE+AMpr25HruA"aes256_str = "M2yF9+kNzRnl+KQkm3DrQVBZ1WNyeUDFtqx0H8bz35E="base64_str = "SSA8MyBSdWJ5IQ=="plain_text = "I <3 Ruby!"
  • 是的,我也一样。这个问题只是一个 Ruby 编码练习,还是你正在学习加密算法课程?无论哪种方式,您似乎都被要求调查这两种加密方法的代码破解算法。很奇怪。
  • 这是一个 Ruby 编码练习,老实说,我在 Ruby 中找不到任何库或任何可以在没有和给定密钥的情况下解密 aes256 和河豚加密的 gem
  • 作为教授计算机语言的练习,这让我觉得非常浪费时间。

标签: ruby encryption base64 aes blowfish


【解决方案1】:

首先,在没有密钥的情况下破解 AES-256 和 Blowfish 的唯一方法是暴力枚举每个可能用作密钥的 32 字节组合。从理论上讲,这意味着它在我们的一生中是不可破解的。由于您也有纯文本,因此您可能会利用一些漏洞,但我怀疑您在现实生活中会遇到这种情况。

其次,也是最重要的,只是通过那个站点,encode-decode.comhttps://encode-decode.com/,即使你知道密码,你实际上也没有足够的信息来解码字符串。

AES256 密码功能的各种操作模式需要 32 字节(有时是 64 字节)密钥。您使用的密钥(您可能只是将其留空)需要转换为 32 字节的加密密钥。这是使用散列算法完成的,但我们不知道使用的是哪一个。希望该站点使用了密钥派生功能,该功能提供了一些安全优势。但是,密钥派生函数需要多个参数,我们需要知道要输入哪些参数以及我们的秘密才能获得正确的加密密钥。

最后,我们不知道秘密是否在被散列之前与盐连接。在不知道是否使用了盐以及盐是什么的情况下,我们无法确定用于加密纯文本的正确 32 字节密钥。

总而言之,您的问题的答案是:不,在不知道密钥的情况下没有快速解密该字符串的方法。

但是,加密是一个很棒的学习主题。

我建议您查看 OpenSSL library 的 ruby​​ 文档。它们实际上非常好(除了我在下面提到的注意事项之外)。

PBKDF2 Password-based Encryption function 是我所指的密钥派生函数之一。

使用 AES 加密时,您很可能希望使用 AES-256-GCM,这是经过身份验证的加密。

一些注意事项:

  • 不要随意使用密码...了解它们的优缺点
  • 不要使用 AES-128-EBC - explination

另一个不错的加密库是rb-NaCl

【讨论】: