两个开发源码加密库openssl和cryptlib的比较

【openssl资源】
作者:Eric Yang等
官方网站:http://www.openssl.org
中文网站推荐:http://gdwzh.126.com
当前版本: openssl-0.9.7
【Cryptlib】
作者:Wei Dai
下载网站:http://www.eskimo.com/~weidai/cryptlib.html
当前版本:Version 5.0

目前开放源代码的加密库中,openssl和cryptlib都是比较流行的,本文将根据自己的一点理解对这两个库作一些比较,希望能对大家有用。这两个库的构造思想和目的都不太一样. Openssl主要是针对SSL/TLS协议的实现,SSL的功能体现的非常完善,而算法库只是一个附带的必要部分,当然也是非常重要和完善的一个部分。Crypylib则就是实现了加密算法以及相关的一些编码标准。
【openssl的组成和特点】
openssl是一个非常优秀的SSL/TLS开放源码软件包,它包括SSL库、加密算法库以及应用程序三大部分,并提供了测试程序和一些应用例子,实现了SSL/TLS协议和其相关的PKI标准。openssl因为开发的比较早,所以采用了c语言作为编写的语言,但是,openssl里面确可以找到很多面向对象的思想,如BIO的封装就是一个典型的例子。对于刚刚开始接触openssl的技术人员来说,可能会觉得有点困难,因为openssl的结构非常膨大,即便要阅读完其非常不完善的文档,工作量也是非常膨大的。建议开始接触openssl的时候,除了有一些基本的密码学和PKI的概念外,最好从使用它提供的一些应用程序开始。其实,openssl的应用程序已经很完善,许多CA就是基于这些基础上做成的。
对于很多人来说,openssl应用程序就足以完成他们需要的功能,openssl应用程序主要提供了下列的一些功能:
1.各种类型密钥以及密钥参数的生成和格式转换功能
2.使用各种加密算法进行数据加密的功能
3.证书请求、证书生成和签发以及证书其它相关标准的转换功能,实现了一个CA的功能
4.信息摘要算法以及其相关编码的实现
5.SSL协议模拟客户端和服务器端的实现,可以用来测试SSL服务器和SSL客户端程序。
【Cryptlib的组成和特点】
Cryptlib实现了各种公开密钥算法、对称加密算法、数字签名算法、信息摘要算法以及其相关的其它算法等等。它采用C++语言编写而成,因为是面向对象语言,所以对于初学者来说更容易理清其结构。该库没有提供应用程序,只是作为库函数提供应用。因为基于C++面向对象的思想,其算法的剥离相对于openssl来说可能更加容易。对于不需要涉及SSL协议的技术人员来说,使用该库函数应用是一个不错的选择。     
【应用现状以及建议】
目前,很多CA以及其它PKI商业程序都是基于openssl开发的,基于openssl开发的好处周期非常短,而且功能强大。而Cryptlib因为仅仅局限于加密算法,所以其应用没有openssl广泛,但是对于只需要加密算法的情况来说,这是一个更好的选择。
建议如果你的应用涉及到SSL等PKI协议,应该使用openssl,如果只是应用一些加密算法,则建议使用Cryptlib.

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用openssl实现DES加密和解密的源码以及注释: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/des.h> // 引入openssl中DES算法相关的头文件 #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. 引入openssl中DES算法相关的头文件 ```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; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值