一、主要API
typedef unsigned char DES_cblock[8];
void DES_random_key(DES_cblock *ret);
int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule);
void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);
void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int enc);
void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, long length, DES_key_schedule *schedule, DES_cblock *ivec, int enc);
二、代码示例
1. ECB 模式
#include <iostream>
#include <stdio.h>
#include <openssl/des.h>
#pragma comment(lib,"libssl.lib")
#pragma comment(lib,"libcrypto.lib")
using namespace std;
int des_ecb_test()
{
DES_cblock key = "heheheh";
DES_key_schedule schedule;
DES_set_key_checked(&key, &schedule);
const_DES_cblock input = "heheheh";
DES_cblock output;
printf("Plaintext: %s\n", input);
DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);
printf("Encrypted!\n");
printf("Ciphertext: ");
int i;
for (i = 0; i < sizeof(input); i++)
printf("%02x", output[i]);
printf("\n");
DES_ecb_encrypt(&output, &input, &schedule, DES_DECRYPT);
printf("Decrypted!\n");
printf("Plaintext: %s\n", input);
return 0;
}
2. CBC 模式
int des_cbc_test()
{
const char* keystring = "this is my key";
DES_cblock key;
DES_key_schedule key_schedule;
DES_string_to_key(keystring, &key);
if (DES_set_key_checked(&key, &key_schedule) != 0) {
printf("convert to key_schedule failed.\n");
return -1;
}
unsigned char input[] = "Lhapy";
size_t len = (sizeof(input) + 7) / 8 * 8;
unsigned char* output = new unsigned char[len + 1];
printf("PlainText: %s\n", input);
DES_cblock ivec;
memset((char*)&ivec, 0, sizeof(ivec));
DES_ncbc_encrypt(input, output, sizeof(input), &key_schedule, &ivec, DES_ENCRYPT);
printf("CipherText: ");
for (int i = 0; i < len; ++i)
printf("%02x ", output[i]);
printf("\n");
memset((char*)&ivec, 0, sizeof(ivec));
DES_ncbc_encrypt(output, input, len, &key_schedule, &ivec, 0);
printf("PlainText: %s\n", input);
delete[] output;
return 0;
}