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

Tud*_*dor 18 c openssl cryptography password-encryption kdf

例如,命令:

openssl enc -aes-256-cbc -a -in test.txt -k pinkrhino -nosalt -p -out openssl_output.txt
Run Code Online (Sandbox Code Playgroud)

输出如下:

key = 33D890D33F91D52FC9B405A0DDA65336C3C4B557A3D79FE69AB674BE82C5C3D2
iv  = 677C95C475C0E057B739750748608A49
Run Code Online (Sandbox Code Playgroud)

这个密钥是如何生成的?(作为答案的C代码太棒了要求:))另外,iv是如何生成的?

对我来说看起来像某种十六进制.

ind*_*div 36

OpenSSL使用EVP_BytesToKey函数.你可以在里面找到它的电话apps/enc.c.在enc使用工具在默认情况下密钥导出算法(KDF)使用MD5摘要,如果你没有指定用不同的消化-md说法.现在它默认使用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;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

gcc b2k.c -o b2k -lcrypto -g
./b2k
Key: 5f4dcc3b5aa765d61d8327deb882cf992b95990a9151374abd8ff8c5a7a0fe08
IV: b7b4372cdfbcb3d16a2631b59b509e94
Run Code Online (Sandbox Code Playgroud)

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

openssl enc -aes-256-cbc -k password -nosalt -p < /dev/null
key=5F4DCC3B5AA765D61D8327DEB882CF992B95990A9151374ABD8FF8C5A7A0FE08
iv =B7B4372CDFBCB3D16A2631B59B509E94
Run Code Online (Sandbox Code Playgroud)

OpenSSL 1.1.0c改变了一些内部组件中使用的摘要算法.以前使用MD5,1.1.0切换到SHA256.请注意,更改不会影响您EVP_BytesToKey和命令openssl enc.