使用openssl库进行DES加密
来源:互联网 发布:nginx http 编辑:程序博客网 时间:2024/05/18 02:10
openssl库实现了大多数的加密算法,如AES,DES,RSA等等。
首先安装openssl库,命令如下:
sudo apt-get install libssl-dev
在代码中,引用对应的头文件
#include <openssl/des.h>
DES加密的主要函数如下:
typedef unsigned char DES_cblock[8];//生成一个随机的key,必须使用下面的set_key函数转换为schedule之后才能使用void DES_random_key(DES_cblock *ret);//设置key//这两个函数的主要区别在于是否检测key的奇偶校检位//checked会对奇偶校检位进行检查,如果校检位错误,返回-1,如果key强度比较弱,返回-2;//unchecked则不会检查int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule);void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);//使用ECB模式进行加密//每次仅能加密一个DES_cblock,即8个字节//enc可以是DES_ENCRYPT或者DES_DECRYPTvoid DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int enc);//使用CBC模式进行加密//length指明文或者密文长度//ivec是初始化向量IV//如果length不是8的倍数,会使用00填充void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, long length, DES_key_schedule, DES_cblock *ivec, int enc);
ECB,电子密码本模式,就是将数据按照8个字节一段进行DES加密或解密得到一段段的8个字节的密文或者明文,最后一段不足8个字节(一般补0或者F),按照需求补足8个字节进行计算(并行计算),之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
CBC,密文分组链接方式,它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:
1. 首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
2. 第一组数据D1与初始化向量IV异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
3. 第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
4. 之后的数据以此类推,得到Cn
5. 按顺序连为C1C2C3......Cn即为加密结果。
代码示例:
ECB模式
#include <stdio.h>#include <openssl/des.h>int main(int argc,char **argv){ DES_cblock key; //随机密钥 DES_random_key(&key); DES_key_schedule schedule; //转换成schedule DES_set_key_checked(&key, &schedule); const_DES_cblock input = "hehehe"; DES_cblock output; printf("cleartext: %s\n", input); //加密 DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT); printf("Encrypted!\n"); printf("ciphertext: "); 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;}
#include <openssl/des.h>#include <stdio.h>#include <string.h>int main(int argc, char** argv){ unsigned char *keystring = "this is my key"; DES_cblock key; DES_key_schedule key_schedule; //生成一个 key DES_string_to_key(keystring, &key); if (DES_set_key_checked(&key, &key_schedule) != 0) { printf("convert to key_schedule failed.\n"); return -1; } //需要加密的字符串 unsigned char input[] = "this is a text being encrypted by openssl"; size_t len = (sizeof(input)+7)/8 * 8; unsigned char *output = malloc(len+1); //IV DES_cblock ivec; //IV设置为0x0000000000000000 memset((char*)&ivec, 0, sizeof(ivec)); //加密 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)); //解密 DES_ncbc_encrypt(output, input, len, &key_schedule, &ivec, 0); printf("%s\n", input); free(output); return EXIT_SUCCESS;}
注意编译的时候要加上crypto库,命令如下:
gcc main.c -lcrypto
使用DES_string_to_key()时,函数内部会对传入的string进行处理,设置奇偶校检位等,可能会造成同样的密钥,加密的结果与其他DES实现方式不同。解决这个问题,可以使用下面的代码:
DES_cblock key;memcpy(key, "password", 8);DES_set_key_unchecked(&key, &schedule);
0 0
- 使用openssl库进行DES加密
- 使用openssl库进行DES加密
- 使用openssl库进行DES加密
- 使用OpenSSL进行DES加密
- 使用openssl库实现des,3des加密
- 使用openssl库实现des,3des加密
- 使用openssl库实现des,3des加密
- C语言使用openssl库进行加密
- VC++使用OpenSSL的DES加密
- 使用JCE进行DES加密
- 使用DES进行加密解密
- Android 使用OpenSSL进行3DES加密 c与java互通
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- 使用openssl库实现des&amp;&amp;3des加密
- 使用openssl进行加密解密
- openssl des 加密解密
- C语言基本概念总结
- Ubuntu 14上编译Android 4.4,退出terminal,无法再次启动emulator
- [hdu3732]dp-背包-转换
- openVswitch(OVS)源代码之linux RCU锁机制分析
- 【PostgreSQL】PostgreSQL hstore类型数据增删改查
- 使用openssl库进行DES加密
- 康托展开
- JPA:mappedby与joincolmun
- 第八周项目一 求分段函数函数值
- hive 对于join条件如何书写
- 玩转网络营销必懂的名词内涵!!
- gawk应用案例
- 求函数的值
- 非常酷的可视化日志分析软件:Logstalgia