密码是私钥的公钥加密工具?

信息安全 密码学 开源
2021-08-15 21:52:55

是否有任何用于公钥加密的免费和开源工具,其中私钥只是一个选择的密码?

这是我需要的:

  • 我想使用脚本每小时进行一次备份
  • 我只想使用开源工具。
  • 备份必须加密,
  • 我需要能够在没有任何文件的情况下解密它们。

我不能对备份使用对称加密,因为无法在脚本中以明文形式提供密码,并且每次备份密码时都不会询问我(例如,因为当我有 1 个月的假期时,备份需要仍待制作)。

所以我想到了公钥密码学,但我读到的所有工具都将私钥存储在一个文件中。我害怕丢失它,就像所有其他数据一样(这就是我首先要做备份的原因)。想象一下我的磁盘发生了硬件故障,有人偷了它,它被火烧毁了,等等。当然,我有备份,但是没有私钥文件我无法解密它们,现在丢失了!当然,我可以备份我的私钥文件,但我只是不想依靠文件来解密我的数据。

我找到了一个解决方案(至少从数学的角度来看,因为我找不到任何实现它的工具)。假设我有密码。让我们使用以下函数 p2rsapk 生成一对素数 (p1,p2):

(p1,p2) = p2rsapk(password) = {
  bits = password as vector of bits
  (n1,n2) = split bits into two parts in deterministic way, e.g. just take halves
  p1 = find prime based on n1, e.g. lowest prime p1 s.t. p1 > 2^n1-2
  p2 = find prime based on n2
}

瞧!我们刚刚获取了一个密码并将其转换为我们的私钥/公钥对。现在我可以用公钥(由脚本使用)加密我的备份,并在不需要任何私钥文件的情况下解密它(因为我的密码是我的私钥,在 p2rsapk 函数的帮助下)。

我还可以将我的公钥发送给朋友,这样他们就可以向我发送加密的消息,我可以从任何地方解密它们,而无需访问我不再需要的私钥文件。

然而,虽然这个想法很简单,但我还没有找到任何实现它的工具。这种方法是否已知?有这方面的工具吗?

编辑:我不能足够强调不依赖文件作为私钥对我来说有多重要。我很清楚将私钥存储在(可能受密码保护的)文件中的方法及其优缺点,并且我承认这是在许多情况下最安全的方法。有许多书籍、教程和手册页描述了如果想要将私钥保存在文件中时如何进行操作。我知道这一点,但是在回答时请记住,严格要求没有用于存储私钥的文件。

EDIT2:我完全了解弱密码的问题。我知道密码是最薄弱的环节,所以请假设我将使用一个安全的密码(至少 50 个字符,包括大小写字母、数字、符号和字典单词)。

4个回答

从密码中确定性地生成私钥是已知的并且有效;但是,它有以下缺点:任何人都可以尝试暴力破解您的密码,因为公钥是public从任何潜在的密码重新运行密钥生成算法并查看结果是否与公钥匹配就足够了。

我们很少希望密码出现在第一线,因为我们是大脑有限的人类,我们准备记住的密码相当脆弱。使用密码加密私钥文件的更常见方法允许通过管理保存私钥文件副本的位置来增加一定程度的额外安全性(您需要多个副本,因为密钥不能丢失,但是在安全的地方有一份副本与将其公开是不同的)。

此外,使用密码加密的私钥文件可以变成两个私钥文件,每个私钥文件都使用特定密码进行加密:这样,两个人就有可能打开备份。毕竟,您担心丢失数据,但如果这是在企业设置中,您的同事可能也会担心丢失数据——从他们的角度来看,数据丢失可能表现为您被碾压乘公共汽车。在password-is-private-key配置中,密码丢失的保护必须是共享密码,这不是很灵活。

如果您确实想遵循密码即私钥的道路,您可能必须编写自己的工具。然后,您会发现使用ElGamal密钥要容易得多,它只是对给定值q取模的整数(组顺序,它是公共的)。OpenPGP格式支持 ElGamal 密钥,因此使用OpenPGP 库(例如GnuPG)进行开发应该相对简单

任何用于生成非对称密钥对的软件都使用随机输入。如果密钥生成器两次接收到相同的随机输入,它将生成相同的密钥对。因此,您可以通过将随机输入替换为您的密码来根据您的密码生成密钥对。例如,这可以在 OpenSSL 中通过在调用 RSA_generate_key 之前使用您的密码(或密码的哈希)播种 PRNG 来完成。

如果您不使用 C 编写代码,Cryptico是一个 JavaScript 工具,具有基于密码生成 RSA 密钥对的方法。

话虽如此,满足您需求的最简单的解决方案是生成一个随机的非对称密钥对,使用基于密码的对称密钥加密私钥并发布加密的私钥,使其永远不会丢失。

在非对称密码学中,密钥必须满足公钥和私钥之间的几个数学关系。通过获取几个变量(可能必须是随机或大素数或类似的,取决于算法)并将它们放入两组不同的方程组,一个返回公钥,另一组方程返回私钥。

这不适用于对称密钥加密,其中密钥只是一个必要长度的字符串。

因此,虽然您可以使用密码/短语并将其推送到基于密码的密钥派生函数中,以将其映射到对称密钥加密所需长度的密钥,但无法使用它将密码映射到任何一个非对称密码学中的变量或最终密钥。

我不能对备份使用对称加密,因为无法在脚本中以明文形式提供密码,并且每次备份密码时都不会询问我(例如,因为当我有 1 个月的假期时,备份需要仍待制作)。

您可以使用 PBKDF2 生成对称密钥吗?该脚本不会有明文密码(尽管密钥显然可以访问),所以如果问题只是密码不能以这种方式存储,这是一个选项。