用openssl的DES的CBC模式对字符串进行加密

在研究了一天openssl的des加密算法后,为了遗忘,把代码留下

我的编程模型:

在这里插入图片描述

#include <openssl/des.h>
#include <stdio.h>
#include <string.h>
#define MAX_LINE 1024
#pragma warning(disable  : 4996)
int main1(void)
{
	//输入密钥
	//DES_cblock key ;
	//memcpy(key, ("88888888"), 8);
	const_DES_cblock key = "1234567";
	//随机密钥
	//DES_random_key(&key);

	DES_key_schedule schedule;			// 密钥
	//转换成schedule
	DES_set_key_checked(&key, &schedule);		//设置密钥

	const_DES_cblock input = "hehehe";  //对字符串进行加密
	DES_cblock output;

	printf("明文: %s\n", input);

	//加密
	// 参数:输入数据、输出数据、密钥、模式
	DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);
	printf("Encrypted!\n");

	printf("密文: ");
	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("cleartext:%s\n", input);
	return 0;

	
}

// DES CBC模式加密,
// 参数:input一般是明文输入 output一般是密文输出
// 难点:len的确定
int cryper1(unsigned char input[], const char *key)
{
	//const char *keystring = "this is my key";
	//DES_cblock key;
	DES_key_schedule key_schedule;
	const_DES_cblock *keystring = (const_DES_cblock *)key;
	//生成一个 key
	//DES_string_to_key(keystring, &key);//根据该字符串,生成一组经过计算的Key,可跳过这步
	DES_set_key_unchecked(keystring, &key_schedule);
	//if (DES_set_key_checked(keystring, &key_schedule) != 0) {
	//	printf("convert to key_schedule failed.\n");
	//	return -1;
	//}

	//需要加密的字符串
	//unsigned char input[] = "this is a text being encrypted by openssl";
	// 最少给len开辟这么多空间 加入input为1 则给len 8个字节空间,凑够一个分组
	size_t len = (sizeof(input) + 7) / 8 * 8;		// size_t 近似于 int
	unsigned char *output = (unsigned char *)malloc(len + 1);
	//IV
	DES_cblock ivec;
	//将向量初始化为0
	//IV设置为0x0000000000000000
	memset((char*)&ivec, 0, sizeof(ivec));

	//加密
	//参数说明
	/*
	input: 输入数据;(8字节长度--好像不一定)
	output: 输出数据;(8字节长度)
	length: 数据长度;(这里数据长度不包含初始化向量长度)
	schedule:密钥;
	ivec: 初始化向量;(一般为8个字节0)
	enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT;*/
	DES_ncbc_encrypt(input, output, sizeof(input), &key_schedule, &ivec, DES_ENCRYPT);

	//输出加密以后的内容
	for (int i = 0; i < len; ++i)
		printf("%02x", output[i]);
	printf("\n");

	memset((char*)&ivec, 0, sizeof(ivec));
	//memset(ivec, 0, sizeof(ivec));    // 经过测试,这个也行

	//解密
	DES_ncbc_encrypt(output, input, len, &key_schedule, &ivec, DES_DECRYPT);

	printf("%s\n", input);

	free(output);
	return EXIT_SUCCESS;
}

// 自己编写的des_CBC模式编程模型
void cryper(unsigned char input[], const char* key)
{
	const_DES_cblock* keystring = (const_DES_cblock*)key;
	DES_key_schedule key_schedule;
	//初始化向量
	DES_cblock ivec;
	memset(ivec, 0, sizeof(ivec));
	size_t len = (sizeof(input) + 7) / 8 * 8;
	unsigned char* output = (unsigned char*)malloc(len+1);
	// 生成密钥
	DES_set_key_unchecked(keystring, &key_schedule);
	// 加密
	DES_cbc_encrypt(input, output, sizeof(input), &key_schedule, &ivec, DES_ENCRYPT);
	// 输出加密后的结果
	printf("密文:");
	for (int i = 0; i < len; ++i) {
		printf("%02x", output[i]);
	}
	printf("\n");
	//解密
	memset(ivec, 0, sizeof(ivec));
	DES_cbc_encrypt(output, input, len,&key_schedule, &ivec, DES_DECRYPT);
	printf("明文:");
	printf("%s", input);
}

int main(void)
{
	//对文件进行加密
	//char buf[1024];
	//FILE *fp = fopen("test.txt", "r");
	//int len;		//字符个数
	//fgets(buf, MAX_LINE, fp);
	//
	//len = strlen(buf);
	//buf[len - 1] = '\0';  /*去掉换行符*/
	//printf("%s %d \n", buf, len - 1);
	//char cryptext[1024] = { 0 };
	unsigned char input[] = "iamyourbaba";
	const char* key = "123456789";
	cryper(input,key);		//加密后的结果哦通过cryptext带回
	getchar();
	//fclose(fp);

}

运行结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值