使用openssl库实现des,3des加密

本文介绍了如何使用openssl库中的DES_ecb3_encrypt方法进行3DES加密和解密操作。作者指出openssl库支持多种加密算法,并提供了在winXP下使用openssl库的VC配置方法。同时,分享了适用于linux和windows平台的代码链接,强调在实际应用中要注意3DES的加密模式(ECB)、密钥长度(24位)、以及内容的切分和填充规则。
摘要由CSDN通过智能技术生成

说明:最近工作中用到3des(Triple DES)加密,网上的资料大部分都是介绍算法原理,没什么兴趣,man了一下查到openssl提供DES_ecb3_encrypt方法,正合我意!提示:openssl库支持很多加密算法哦,如:AES/DES/MD5/RSA...,而且很轻松的支持其他平台,我就在winXP下安装了openssl并在VC中设置头文件目录及库文件目录,用来是用openssl库。   代码下载:linux平台代码:http://pickup.mofile.com/2320229012095812windows平台代码:http://pickup.mofile.com/7098802825381299具体使用时需要注意des算法的加密模式、密钥长度、补齐方式,我这里采用3des的ECB方式、24位密钥(不足右补0)、内容长度以8字节切分,不能被8整除的末尾部分,根据长度不足8字节的部分,填充0x01-0x08

今天修正了一下代码里面一个常识性错误:des加密密钥也是8位来处理的,所以在密钥置换时只取8位。希望没有误导大家,我同时更新了源代码下载地址
好代码,标准的位数不足应该都补0x00把另外,如何得到全部的加密后密文的16进制字符?

代码如下:

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4. #include <openssl/des.h>   
  5. /************************************************************************  
  6. ** 本例采用:  
  7. ** 3des-ecb加密方式;  
  8. ** 24位密钥,不足24位的右补0x00;  
  9. ** 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,...  
  10. ** 本身已8位对齐的,后面补八个0x08。  
  11. ************************************************************************/   
  12. int main(void)   
  13. {   
  14.     int docontinue = 1;   
  15.     char *data = "hello world!"/* 明文 */   
  16.     int data_len;   
  17.     int data_rest;   
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是使用openssl实现DES加密和解密的源码以及注释: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/des.h> // 引入opensslDES算法相关的头文件 #define BLOCK_SIZE 8 // 定义加密块的大小为8字节 // 将16进制字符串转换为字节数组 void hexStrToByte(const char* source, unsigned char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i += 2) { sscanf(source + i, "%2hhx", dest + i / 2); } } // 将字节数组转换为16进制字符串 void byteToHexStr(const unsigned char* source, char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i++) { sprintf(dest + i * 2, "%02x", source[i]); } } // 加密 void encrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的加密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 } } // 解密 void decrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的解密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 } } int main() { const char* keyStr = "01234567"; // 密钥 const char* inputStr = "Hello, DES!"; // 待加密的字符串 unsigned char key[BLOCK_SIZE] = {0}; hexStrToByte(keyStr, key, strlen(keyStr)); // 将16进制字符串转换为字节数组 unsigned char input[BLOCK_SIZE * 2] = {0}; strcpy((char*) input, inputStr); int inputLen = strlen(inputStr); int paddedLen = inputLen + (BLOCK_SIZE - inputLen % BLOCK_SIZE); // 计算填充后的长度 unsigned char* paddedInput = (unsigned char*) malloc(paddedLen + 1); memset(paddedInput, 0, paddedLen + 1); memcpy(paddedInput, input, inputLen); // 将待加密的字符串拷贝到填充后的字符串中 unsigned char* output = (unsigned char*) malloc(paddedLen + 1); memset(output, 0, paddedLen + 1); encrypt(key, paddedInput, output); // 加密 char* outputHexStr = (char*) malloc(2 * paddedLen + 1); byteToHexStr(output, outputHexStr, paddedLen); // 将加密后的字节数组转换为16进制字符串 printf("Encrypted: %s\n", outputHexStr); memset(paddedInput, 0, paddedLen + 1); decrypt(key, output, paddedInput); // 解密 printf("Decrypted: %s\n", paddedInput); free(paddedInput); free(output); free(outputHexStr); return 0; } ``` 注释详解如下: 1. 引入opensslDES算法相关的头文件 ```c #include <openssl/des.h> ``` 2. 定义加密块的大小为8字节 ```c #define BLOCK_SIZE 8 ``` 3. 将16进制字符串转换为字节数组 ```c void hexStrToByte(const char* source, unsigned char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i += 2) { sscanf(source + i, "%2hhx", dest + i / 2); } } ``` 4. 将字节数组转换为16进制字符串 ```c void byteToHexStr(const unsigned char* source, char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i++) { sprintf(dest + i * 2, "%02x", source[i]); } } ``` 5. 加密 ```c void encrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的加密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 } } ``` 6. 解密 ```c void decrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的解密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 } } ``` 7. 主函数:生成密钥、待加密的字符串,进行加密和解密,输出结果 ```c int main() { const char* keyStr = "01234567"; // 密钥 const char* inputStr = "Hello, DES!"; // 待加密的字符串 unsigned char key[BLOCK_SIZE] = {0}; hexStrToByte(keyStr, key, strlen(keyStr)); // 将16进制字符串转换为字节数组 unsigned char input[BLOCK_SIZE * 2] = {0}; strcpy((char*) input, inputStr); int inputLen = strlen(inputStr); int paddedLen = inputLen + (BLOCK_SIZE - inputLen % BLOCK_SIZE); // 计算填充后的长度 unsigned char* paddedInput = (unsigned char*) malloc(paddedLen + 1); memset(paddedInput, 0, paddedLen + 1); memcpy(paddedInput, input, inputLen); // 将待加密的字符串拷贝到填充后的字符串中 unsigned char* output = (unsigned char*) malloc(paddedLen + 1); memset(output, 0, paddedLen + 1); encrypt(key, paddedInput, output); // 加密 char* outputHexStr = (char*) malloc(2 * paddedLen + 1); byteToHexStr(output, outputHexStr, paddedLen); // 将加密后的字节数组转换为16进制字符串 printf("Encrypted: %s\n", outputHexStr); memset(paddedInput, 0, paddedLen + 1); decrypt(key, output, paddedInput); // 解密 printf("Decrypted: %s\n", paddedInput); free(paddedInput); free(output); free(outputHexStr); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值