Openssl 之 DES 学习笔记

邮差的信 提交于 2019-12-21 23:37:08

一、主要API


typedef unsigned char DES_cblock[8];
 
//生成一个随机的 key,必须使用下面的 set_key 函数转换为 schedule 之后才能使用
void DES_random_key(DES_cblock *ret);
 
//功能:设置 key
//主要区别:是否检测 key 的奇偶校检位
//checked 会对奇偶校检位进行检查,如果校检位错误,返回-1,如果key强度比较弱,返回-2;
//unchecked 则不会检查
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);
 

/*
* brief: 使用 ECB 模式进行加密
* parameters:
* 		input: 输入数据(8字节长度)
* 		output: 输出数据(8字节长度)
* 		ks: 密钥
* 		enc: 加密 --> DES_ENCRYPT, 解密 --> DES_DECRYPT
*/
void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int enc);
 

/*
* brief: 使用 CBC 模式进行加密
* parameters:
* 		input: 输入数据(8字节长度)
* 		output: 输出数据(8字节长度)
* 		length: 数据长度(不包括初始向量IV的长度)
* 		schedule: 密钥
* 		ivec: 初始向量(8字节,一般为0)
* 		enc: 加密 --> DES_ENCRYPT, 解密 --> DES_DECRYPT
* note:
* 		length 指明文或者密文长度
* 		如果 length 不是8的倍数,会使用00填充
*/
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";  // unsigned char[8] 类型
	//DES_random_key(&key);  // 设置随机密钥 

	DES_key_schedule schedule;
	DES_set_key_checked(&key, &schedule);  // 转换成 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);
	// system("pause");
	return 0;
}

2. CBC 模式

int des_cbc_test()
{
	const char* keystring = "this is my key";
	DES_cblock key;
	DES_key_schedule key_schedule;

	/* 生成一个 key  */
	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;  // 初始向量,IV  
	memset((char*)&ivec, 0, sizeof(ivec));  // IV 设置为 0x0000000000000000 

	/* 加密  */
	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;

	// system("pause");
	return 0;
}

永远别停下朝向更好的脚步!
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!