转自 : http://blog.csdn.net/p0x1307/article/details/40115567
openssl库实现了大多数的加密算法,如AES,DES,RSA等等。
首先安装openssl库,命令如下:
sudo apt-get install libssl-dev
在代码中,引用对应的头文件
#include <openssl/des.h>
DES加密的主要函数如下:
- typedef unsigned char DES_cblock[8];
-
-
- void DES_random_key(DES_cblock *ret);
-
-
-
-
-
- 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);
-
-
-
-
- void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int enc);
-
-
-
-
-
- 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;
-
- 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;
- }
CBC模式:
- #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;
-
-
- 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);
-
- DES_cblock ivec;
-
-
- 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库,命令如下:
使用DES_string_to_key()时,函数内部会对传入的string进行处理,设置奇偶校检位等,可能会造成同样的密钥,加密的结果与其他DES实现方式不同。解决这个问题,可以使用下面的代码:
- DES_cblock key;
- memcpy(key, "password", 8);
- DES_set_key_unchecked(&key, &schedule);