赞
踩
在研究了一天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); }
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。