2

我正在尝试使用 OpenSSL 库在 C 中实现三重 DES 加密,但我在密码学方面并不专业。我在这里找到了一个有用的 DES ECB 加密示例代码,但我找不到有关如何实现 3DES 的示例代码,并且大多数 Web 资源只是描述了如何使用 OpenSSL 作为工具。

我已经为特定目的实现了 DES ECB,如下所示

typedef struct
{
    size_t size;
    unsigned char*  data;
} byte_array, *byte_array_ptr;

用于加密

byte_array_ptr des_encrypt_to_pin_block(byte_array_ptr key_bytes, byte_array_ptr xor_bytes)
{
    if ((key_bytes->size != 8) || (xor_bytes->size != 8))
        return NULL;

    DES_key_schedule    schedule;
    const_DES_cblock    key_data;
    const_DES_cblock    xor_data;
    DES_cblock      buffer;

    memcpy(&key_data, key_bytes->data, key_bytes->size);
    memcpy(&xor_data, xor_bytes->data, xor_bytes->size);

    if (DES_set_key(&key_data, &schedule) < 0)
    {
        printf("ERROR: %s", "DES Set Key Error!");
        return NULL;
    }

    DES_ecb_encrypt(&xor_data, &buffer, &schedule, DES_ENCRYPT);

    byte_array_ptr pin_block;
    pin_block = (byte_array_ptr)malloc(sizeof(size_t) + 8);
    pin_block->size = 8;
    pin_block->data = (unsigned char *)malloc(pin_block->size);

    memcpy(pin_block->data, &buffer, pin_block->size);

    return pin_block;
}

和解密

byte_array_ptr des_decrypt_to_xor_bytes(byte_array_ptr key_bytes, byte_array_ptr pin_block)
{
    if ((key_bytes->size != 8) || (pin_block->size != 8))
        return NULL;

    DES_key_schedule    schedule;
    const_DES_cblock    key_data;
    const_DES_cblock    pin_data;
    DES_cblock      buffer;

    memcpy(&key_data, key_bytes->data, key_bytes->size);
    memcpy(&pin_data, pin_block->data, pin_block->size);

    if (DES_set_key(&key_data, &schedule) < 0)
    {
        printf("ERROR: %s", "DES Set Key Error!");
        return NULL;
    }

    DES_ecb_encrypt(&pin_data, &buffer, &schedule, DES_DECRYPT);

    byte_array_ptr xor_bytes;
    xor_bytes = (byte_array_ptr)malloc(sizeof(size_t) + 8);
    xor_bytes->size = 8;
    xor_bytes->data = (unsigned char *)malloc(xor_bytes->size);

    memcpy(xor_bytes->data, &buffer, xor_bytes->size);

    return xor_bytes;
}

但我不知道如何为 3DES 做这件事。

任何想法?

4

1 回答 1

3

OpenSSL 为所有加密方案的 EDE 模式下的三重 DES 提供了一组函数(使用密钥 #1 加密,使用密钥 #2 解密,使用密钥 #3 加密)。当键 #1 等于键 #3 时也是常见的情况,这种情况也有功能。

因此,如果您拥有所有三个键,则功能是:

DES_ecb3_encrypt()
DES_ede3_cbc_encrypt()
DES_ede3_ofb_encrypt()
DES_ede3_cfb_encrypt()

如果您只有两个键,则功能是:

DES_ecb2_encrypt()
DES_ede2_cbc_encrypt()
DES_ede2_ofb_encrypt()
DES_ede2_cfb_encrypt()
于 2013-09-30T10:04:58.447 回答