当前位置: 首页 > 面试题库 >

与OpenSSL命令兼容的键功能的密码?

宋涵忍
2023-03-14
问题内容

例如,命令:

openssl enc -aes-256-cbc -a -in test.txt -k pinkrhino -nosalt -p -out openssl_output.txt

输出类似:

key = 33D890D33F91D52FC9B405A0DDA65336C3C4B557A3D79FE69AB674BE82C5C3D2
iv  = 677C95C475C0E057B739750748608A49

该密钥是如何生成的?(以C代码作为答案可能真是太麻烦了:))而且,iv是如何生成的?

在我看来有点像十六进制。


问题答案:

OpenSSL使用功能EVP_BytesToKey。您可以在找到呼叫apps/enc.c。enc如果未使用-md参数指定其他摘要,则该实用程序默认情况下会在密钥派生算法(KDF)中使用MD5摘要。现在默认情况下使用SHA-256。这是使用MD5的工作示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>

int main(int argc, char *argv[])
{
    const EVP_CIPHER *cipher;
    const EVP_MD *dgst = NULL;
    unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
    const char *password = "password";
    const unsigned char *salt = NULL;
    int i;

    OpenSSL_add_all_algorithms();

    cipher = EVP_get_cipherbyname("aes-256-cbc");
    if(!cipher) { fprintf(stderr, "no such cipher\n"); return 1; }

    dgst=EVP_get_digestbyname("md5");
    if(!dgst) { fprintf(stderr, "no such digest\n"); return 1; }

    if(!EVP_BytesToKey(cipher, dgst, salt,
        (unsigned char *) password,
        strlen(password), 1, key, iv))
    {
        fprintf(stderr, "EVP_BytesToKey failed\n");
        return 1;
    }

    printf("Key: "); for(i=0; i<cipher->key_len; ++i) { printf("%02x", key[i]); } printf("\n");
    printf("IV: "); for(i=0; i<cipher->iv_len; ++i) { printf("%02x", iv[i]); } printf("\n");

    return 0;
}

用法示例:

gcc b2k.c -o b2k -lcrypto -g
./b2k
Key: 5f4dcc3b5aa765d61d8327deb882cf992b95990a9151374abd8ff8c5a7a0fe08
IV: b7b4372cdfbcb3d16a2631b59b509e94

生成与此OpenSSL命令行相同的密钥:

openssl enc -aes-256-cbc -k password -nosalt -p < /dev/null
key=5F4DCC3B5AA765D61D8327DEB882CF992B95990A9151374ABD8FF8C5A7A0FE08
iv =B7B4372CDFBCB3D16A2631B59B509E94

OpenSSL 1.1.0c更改了某些内部组件中使用的摘要算法。以前使用MD5,并且1.1.0切换到SHA256。小心的变化不影响你在这两个EVP_BytesToKey和命令状openssl enc。



 类似资料:
  • 我正在尝试使用带有相同密钥和 iv 的 AES 加密相同的文本。我使用 bash 方法和 ruby 的 openssl stdlib,并对加密结果进行 b64 编码。但结果不同!我试图理解为什么。这是我所做的: 红宝石(1.9.3-p448) 砰砰�� -iv参数设置为上面计算的iv_hex值。 ========================================= 我仔细检查了静脉注

  • 我已经在Selenium IDE中创建了一组测试,并计划将其导出到Java。今天第一次尝试导出,我希望得到的Java代码可以在稍加润色后编译,但我对无法导出的不受支持的命令数量感到不快: 搜索类似的问题会带来更多不受支持的Selenium IDE命令,如、等。我想知道是否有一个列表可以避免这样的命令,以便于导出。我打赌命令应该在列表中;尽管命令本身以某种方式被转换,但任何其他试图使用存储值的命令似

  • 问题内容: 这是在我的Angular代码中正常工作的ES5函数: 我想将其转换为ES6箭头功能 但是它给出了错误 ES6箭头功能是否与Angular不兼容? 编辑:我想也许Angular不能推断出该名称,因此无法注入它,但随后我将其记录到控制台,并确实显示了它: 问题答案: 正确。您的AngularJS版本与使用$ injector的箭头功能不兼容。 这主要是因为AngularJS 1.4.6使用

  • 问题内容: 我使用Node.js + passport设置了一个用于用户身份验证的站点。 现在,我需要迁移到Golang,并需要使用保存在db中的用户密码进行身份验证。 Node.js加密代码为: 如何使用Golang制作与Node.js bcrypt相同的哈希字符串? 问题答案: 我相信使用golang.org/x/crypto/bcrypt软件包将是: 工作示例:

  • 我正在尝试用'openSSL'th/命令行以AES-GCM模式加密文件 加密工作,但我找不到检索结果GCM标记的方法。有办法弄到吗? 在这个文档(链接)中,我发现“注意,现在甚至可以使用像CCM或GCM这样的身份验证模式”,但仍然没有关于如何做到这一点的信息。 或者是否有其他标准的macos工具可以做同样的工作? PS:我对通过通用的分布式命令行工具来实现这一点很感兴趣,这不是关于编写自己的实用程

  • 我希望能够使用openssl在命令行中生成一对私钥和公钥,但我不知道该怎么做。到目前为止,我所做的是在命令行中执行以下操作,但这只打印了我不知道确切的内容:s 来自OPENSSL PAGE:要使用显式参数创建EC参数: 有人能告诉我如何得到这样的东西: 我从网上获得的一个代码中获得了这一点,该代码使用这个密钥对通过ECDSA对消息进行签名,但现在我希望能够生成自己的密钥对(从openssl命令行)