3

谁能告诉我如何使用命令行工具接收 16 个字符的字符串并生成一个 16 个字符的加密字符串(以人类可读的格式)。

我已经探索过诸如 openssl 之类的选项,但我无法控制输出的长度。

有人可以建议吗?

4

3 回答 3

3

这里有 Linux 中 ROT13 的描述。我没有测试过:

$alias rot13="tr '[A-Za-z]' '[N-ZA-Mn-za-m]'"

这可能会满足您的需求,尽管它根本不安全。

于 2012-04-12T12:08:48.283 回答
2
echo "abcdefghijklmnop" | gpg --armor -c --output -

但是,这不会分解为 16 个字符的限制。

结果输出:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.10 (GNU/Linux)

jA0EAwMCnM6hI0xpVVFgyScCfr6Zo2fZeuiVWteZKeptcvSBj9wxk2gRMqTERtz9
8dNUHZq2eRA=
=Jpku
-----END PGP MESSAGE-----
于 2012-04-12T12:22:25.413 回答
0

我不知道这将在哪里使用以及您的安全要求的详细信息是什么,因此我将根据您提供的信息进行回答。您需要:

  • 强加密;
  • 输出必须与输入的大小相同;
  • 输出必须是人类可读的。

如果您放弃其中任何一项要求,这很容易。如果不是,这很难——如果不是不可能使用标准 Linux/Unix 工具的话。标准块密码将以块为单位对数据进行编码,因此它们确实具有相同的输入和输出大小——但它们将位序列转换为位序列,并且不能保证输出是“可读的”。然后,您可以使用 HEX(base16)或 base64 对输出进行编码,但这会扩展它(这就是 UtahJarhead 的意思,即“不会超出 N 个字符的限制”)。

可能的解决方案(每个都打破一个要求)是:

  • 使用弱加密(ROT13 之类的替代密码——或者,如果你想要更复杂的东西,请实现Vigenère 密码,但你必须对其进行编码——或者相信其他人的实现);
  • 使用 AES 或其他一些好的分组密码(通过 OpenSSL,正如你提到的)加密,然后在输出上运行 base64;
  • 使用 AES 或其他一些好的分组密码(通过 OpenSSL)进行加密,但不要指望任何人读取输出。

最后一点:加密方案很难设计和实施,涉及的细节太多,因此根本不建议创建临时加密方法......

编辑:正如对另一个答案的评论中提到的,您可以实现一次性键盘,但是您需要与文本一样长的密码,并且需要选择密码的每个字符并在字母表上均匀分布. 散列密码、编码为 ascii 并获取前 n 个字符可能就足够了 [1]。

无论如何,请记住明文太短并且可以“测试”(例如网站或加密文档的密码),对手可以进行详尽的搜索。

[1] 一些密码学家不同意您可以将哈希函数的输出视为“随机”(您将使用“随机 Oracle 模型”)。哈希的编码必须是这样的,给定输入中比特的均匀分布,作为输出的字母的均匀分布。当你把这个“pad”和消息结合起来的时候,一定是一对一的映射,所以最终输出的分布是均匀的。

于 2012-04-12T12:34:50.720 回答