使用openssl库进行DES加密

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_DECRYPT
void 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;
} 


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;

      //生成一个 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);


  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
OpenSSL是一个广泛使用的开放源代码工具包,提供加密和解密功能。它支持DES和RSA等加密算法,可以用来加密和解密数据。DES是一种对称加密算法,使用相同的密钥进行加密和解密。RSA是一种非对称加密算法,使用公钥进行加密,私钥进行解密。 使用OpenSSL进行DES加密和解密,首先需要生成一个DES密钥,然后使用该密钥进行加密和解密操作。可以使用以下命令生成DES密钥: ``` openssl rand -out des.key 8 ``` 生成的密钥保存在des.key文件中。然后使用该密钥进行加密和解密: ``` openssl enc -des -in plaintext.txt -out encrypted.des -kfile des.key openssl enc -d -des -in encrypted.des -out decrypted.txt -kfile des.key ``` 上述命令分别用指定的DES密钥对明文文件plaintext.txt进行加密,然后将加密结果保存到encrypted.des文件中。解密操作则相反,使用相同的DES密钥对加密后的文件进行解密,得到明文文件decrypted.txt。 而要使用RSA算法进行加密和解密,首先需要生成RSA密钥对(公钥和私钥),然后使用公钥进行加密,私钥进行解密。可以使用以下命令生成RSA密钥对: ``` openssl genrsa -out private.pem 1024 openssl rsa -in private.pem -pubout -out public.pem ``` 生成的私钥保存在private.pem文件中,公钥保存在public.pem文件中。然后使用公钥进行加密,私钥进行解密: ``` openssl rsautl -encrypt -in plaintext.txt -out encrypted.rsa -inkey public.pem openssl rsautl -decrypt -in encrypted.rsa -out decrypted.txt -inkey private.pem ``` 上述命令分别使用指定的公钥对明文文件plaintext.txt进行加密,然后将加密结果保存到encrypted.rsa文件中。解密操作则相反,使用相同的私钥对加密后的文件进行解密,得到明文文件decrypted.txt。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值