2013-09-27 34 views
2

我試圖在C語言中使用OpenSSL庫實現三重DES加密,但我並不擅長密碼學。我發現了一個有用的示例代碼here,用於DES ECB加密,但是我找不到關於如何實現3DES的示例代碼,並且大多數Web資源都只是描述瞭如何使用OpenSSL作爲工具。如何在C語言中使用OpenSSL庫實現三重DES加密

我實現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。

有什麼想法?

+0

讓自己多一些按鍵,然後用['DES_ecb3_encrypt'] (http://www.openssl.org/docs/crypto/des.html#) – WhozCraig

+0

爲什麼Triple DES(比AES慢)和ECB(不安全)? – ntoskrnl

+0

感謝您的提示,其實這是一個要求,而不是我的偏好。當然據我所知,這是支付卡行業PIN加密的常用算法。 – anonim

回答

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()