4

(不要与 DES 算法子密钥生成混淆)
(编辑:更多示例)

问题说明:

我这样做是作为学校作业的一部分,我需要在 C 中重新编码 OpenSSL 的部分内容,特别是与 PKI 密码系统有关的部分。ecb到目前为止,我已经用、cbc3des-ecb3des-cbc操作模式从头开始重新编写了核心 DES 算法。该项目的其他部分包括 MD5 和 SHA256。该项目的这一部分侧重于 RSA 密钥的生成、操作和使用。

RSA 密钥操作的一部分包括使用密码对给定密钥进行加密。(不像我以前用 DES 那样单独
使用纯key+ )initial vector

这需要将用户输入的密码转换为 DES 密钥(以及需要的可选附加 IV),然后使用它来加密 RSA 密钥。我知道我正在寻找的函数的通用术语是PBKDFPassword-Based Key Derivation Function。但是,我无法(通过搜索manOpenSSL 或谷歌的页面)找到 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_rsaandhead id_rsa_1查看加密密钥如何更改标头。如果您将两个新密钥与

diff id_rsa_1 id_rsa_2

它们的标头和格式相同,但密钥本身的加密方式不同,即使使用相同的密码。不同之处在于密钥生成(我相信)每次运行时都会生成一个新的随机盐。我会假设散列算法和迭代次数是相同的。此外,与/etc/shadowunix 机器不同,盐似乎没有与密钥一起存储(或者至少我不知道如何阅读它)。

从密码生成 DES 密钥的演示:

更具体的 DES 示例是:

openssl des -P

使用相同的密码多次运行上述命令将始终导致不同的密钥和 iv,可能是因为盐不同。

我的发现和推断的假设:

  • 搜索“如何对 RSA 密钥进行加密? ”会出现很多关于使用 RSA 密钥进行加密的结果。(有时我对 Google 的 nlp 期望过高)
  • 搜索“如何从密码短语生成 DES 密钥? ”会找到很多关于如何生成 16 轮 des 子密钥的结果。
  • 我浏览了 OpenSSL 的来源,但没有运气。如果绝对必要,我会进行详尽的搜索,但代码不是最易读或可搜索的。

  • php原型

  • 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 中的密码加密的密钥的标头中。
4

0 回答 0