【问题标题】:How use the custom key in openssl in AES_set_encrypt_key如何在 AES_set_encrypt_key 中使用 openssl 中的自定义密钥
【发布时间】:2021-02-07 21:13:42
【问题描述】:

我尝试使用 openssl,using a code how example 实现编码和解码,但是当我尝试使用自定义键时,代码损坏,设置自定义键和自定义输入以在 openssl 中使用的当前形式是什么(我相信错误在我的 C 逻辑中,而不是在使用 openssl)

    const char *in = "test";

    size_t in_len = strlen(in);
    unsigned char aes_input[in_len];
    for (size_t i = 0; i != in_len; i++) aes_input[i] = in[i];
//
//    const char *my_custom_key = "my_custom_key";
//    size_t key_len = strlen(my_custom_key);
//    unsigned char aes_key[key_len];
//    for (size_t i = 0; i != in_len; i++) aes_input[i] = my_custom_key[i];
//
    unsigned char aes_key[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB,
                               0xCC,
                               0xDD, 0xEE, 0xFF};

    /* Init vector */
    unsigned char iv[AES_BLOCK_SIZE];
    memset(iv, 0x00, AES_BLOCK_SIZE);

    /* Buffers for Encryption and Decryption */
    unsigned char enc_out[sizeof(aes_input)];
    unsigned char dec_out[sizeof(aes_input)];

    /* AES-128 bit CBC Encryption */
    AES_KEY enc_key, dec_key;
    AES_set_encrypt_key(aes_key, sizeof(aes_key) * 8, &enc_key);
    AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);
    /* AES-128 bit CBC Decryption */
    memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly
    AES_set_decrypt_key(aes_key, sizeof(aes_key) * 8, &dec_key); // Size of key is in bits
    AES_cbc_encrypt(enc_out, dec_out, sizeof(aes_input), &dec_key, iv, AES_DECRYPT);

上面的代码是有效的,但是如果我改用我的自定义键,它就会中断

    const char *my_custom_key = "my_custom_key";
    size_t key_len = strlen(my_custom_key);
    unsigned char aes_key[key_len];
    for (size_t i = 0; i != in_len; i++) aes_input[i] = my_custom_key[i];

//    unsigned char aes_key[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB,
                               0xCC,
                               0xDD, 0xEE, 0xFF};

【问题讨论】:

    标签: c++ c encryption openssl


    【解决方案1】:

    使用文本字符串作为 AES 密钥不是一个好主意,因为:

    1. AES 密钥的大小必须恰好为 AES_KEY_LENGTH 字节。
      "my_custom_key" 为 13 字节,太短了。

    2. ASCII 文本熵低,会严重降低加密的安全性。

    对此的标准解决方案是使用key derivation function,例如PBKDF2,为了“加强”并填充密钥以使其可用于加密。

    如果您只关心密钥大小,那么像 SHA-256 这样的散列函数就足以将密码转换为正确大小的密钥。

    类似这样的:

    std::string pass = "my_custom_key";
    unsigned char key[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, pass.data(), pass.size());
    SHA256_Final(key, &sha256);
    

    【讨论】:

    • “my_custom_key”只是此代码的一个示例,问题是代码中断,当使用带有我的自定义密钥的 aes_key 执行 AES_cbc_encrypt 并使用来自的密钥时出现错误 SIGSEGV(分段错误)例子。
    • 现在,我明白了。我更改了长度或密钥,现在没有段错误
    • AES_cbc_encrypt 段错误,因为 AES_set_encrypt_key 在密钥大小错误时失败。您应该检查每个调用的返回值以确保调用成功。另请注意,IV 为零是不安全的。
    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多