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

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

说明:最近工作中用到3des(Triple DES)加密,网上的资料大部分都是介绍算法原理,没什么兴趣,man了一下查到openssl提供

DES_ecb3_encrypt方法,正合我意!提示:openssl库支持很多加密算法哦,如:AES/DES/MD5/RSA...,而且很轻松的支持其他平台,我就在

winXP下安装了openssl并在VC中设置头文件目录及库文件目录,用来是用openssl库。
   
代码下载:
linux平台代码:http://pickup.mofile.com/2320229012095812
windows平台代码:http://pickup.mofile.com/7098802825381299

具体使用时需要注意des算法的加密模式、密钥长度、补齐方式,我这里采用3des的ECB方式、24位密钥(不足右补0)、内容长度以8字节切分

,不能被8整除的末尾部分,根据长度不足8字节的部分,填充0x01-0x08

代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/des.h>

/************************************************************************
 ** 本例采用:
 **    3
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值