(不要与 DES 算法子密钥生成混淆)
(编辑:更多示例)
问题说明:
我这样做是作为学校作业的一部分,我需要在 C 中重新编码 OpenSSL 的部分内容,特别是与 PKI 密码系统有关的部分。ecb
到目前为止,我已经用、cbc
、3des-ecb
和3des-cbc
操作模式从头开始重新编写了核心 DES 算法。该项目的其他部分包括 MD5 和 SHA256。该项目的这一部分侧重于 RSA 密钥的生成、操作和使用。
RSA 密钥操作的一部分包括使用密码对给定密钥进行加密。(不像我以前用 DES 那样单独
使用纯key
+ )initial vector
这需要将用户输入的密码转换为 DES 密钥(以及需要的可选附加 IV),然后使用它来加密 RSA 密钥。我知道我正在寻找的函数的通用术语是PBKDF或Password-Based Key Derivation Function。但是,我无法(通过搜索man
OpenSSL 或谷歌的页面)找到 OpenSSL 中用于密钥派生的确切函数(或函数)。
演示 DES 密钥生成加密 RSA 密钥:
运行以下不带密码的命令会生成未加密的 RSA 密钥example_plain_key
。
ssh-keygen -t rsa -f example_plain_key
然后运行以下命令将example_plain_key
使用des
密码ecb
模式进行加密。每个命令都将加密版本输出到一个新文件,因此它不会更改原始文件。对两个命令使用相同的密码(例如password)。
openssl rsa -DES-ECB -in id_rsa -out id_rsa_1
openssl rsa -DES-ECB -in id_rsa -out id_rsa_2
您可以使用head id_rsa
andhead id_rsa_1
查看加密密钥如何更改标头。如果您将两个新密钥与
diff id_rsa_1 id_rsa_2
它们的标头和格式相同,但密钥本身的加密方式不同,即使使用相同的密码。不同之处在于密钥生成(我相信)每次运行时都会生成一个新的随机盐。我会假设散列算法和迭代次数是相同的。此外,与/etc/shadow
unix 机器不同,盐似乎没有与密钥一起存储(或者至少我不知道如何阅读它)。
从密码生成 DES 密钥的演示:
更具体的 DES 示例是:
openssl des -P
使用相同的密码多次运行上述命令将始终导致不同的密钥和 iv,可能是因为盐不同。
我的发现和推断的假设:
- 搜索“如何对 RSA 密钥进行加密? ”会出现很多关于使用 RSA 密钥进行加密的结果。(有时我对 Google 的 nlp 期望过高)
- 搜索“如何从密码短语生成 DES 密钥? ”会找到很多关于如何生成 16 轮 des 子密钥的结果。
我浏览了 OpenSSL 的来源,但没有运气。如果绝对必要,我会进行详尽的搜索,但代码不是最易读或可搜索的。
- perl 手册页
- 一个我认为比原来更有帮助的链接
(注意:我没有 OpenSSL 帐户,但认为不需要查看)
最有用的发现使我相信我正在寻找的示例原型看起来像这样:
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
// #include <something_else_maybe.h>
int main(void)
{
int num_iterations = 1000;
char *salt;
char *passphrase;
char *key;
passphrase = getpass("Password: ");
salt = get_some_random_bytes(8); // assumed arbitrary length
// the function in question
key = example_pbkdf(md5_function, num_iterations, salt, 8, passphrase, strlen(passphrase));
printf("Key (in hexadecimal or otherwise) is: %s\n", key);
free(key);
free(passphrase);
free(salt);
return (0);
}
我特别要找的东西:
(知道在哪里寻找这些答案比答案本身更有价值,但所有帮助都值得赞赏。我确实需要 C 中的标头/源/原型/等。)
- 像上面演示的那样运行的函数(如果存在)。它不一定是完美的匹配,我更关心它的作用而不是确切的原型设计或用法。
- 或者,(如果不存在)可以概括为我正在寻找的“算法”的“配方”或一系列操作。
- DES 密钥生成。(虽然包括多个密码,比如 AES,也很棒)
- 盐如何存储在加密的 RSA 密钥中,如果是(如果不是,如何恢复它)。我知道 IV 存储在用 CBC 中的密码加密的密钥的标头中。