欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux下C语言使用openssl库加密算法DES

程序员文章站 2022-07-12 22:42:21
...

DES(Data Encryption Standard)

DES一度是电子数据对称加密的主导者。他影响了现代加密学。最早是在IBM于1970年基于更早的Horst Feistel的设计而开发出来的,算法应美国国家标准局(NBSNational_Bureau_of_Standards) National Bureau of Standards)代理人的邀请加入对美国*敏感电子数据加密的候选方案。在1976年,经过和美国国家安全局(NSA)磋商,NBS最终选择了一个精简版本在1977年发布。

如今在很多应用的加密还是会考虑使用DES。这个主要由于56-byte key size

AES(Advanced Encryption Standard)

是美国联邦*采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称**加密中最流行的算法之一。

//API location:/usr/include/openssl/des.h
#include<openssl/des.h>
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

#define DES_BLOCK_SIZE 8
unsigned char *str2hex(char *str)
{
    unsigned char *ret=NULL;
    int str_len=strlen(str);
    int i=0;
    assert((str_len%2)==0);
    ret=(char *)malloc(str_len/2);
    for(i=0;i<str_len;i+=2)
    {
        sscanf(str+i,"%2hhx",&ret[i/2]);
    }
    return ret;
}
char *padding_buf(char *buf,int size,int *final_size)
{
    char *ret=NULL;
    int pidding_size=DES_BLOCK_SIZE-(size%DES_BLOCK_SIZE);
    int i;
    *final_size=size+pidding_size;
    ret=(char *)malloc(size+pidding_size);
    memcpy(ret,buf,size);
    if(pidding_size!=0)
    {
        for(i=size;i<(size+pidding_size);i++)
        {
            ret[i]=0;
        }
    }
    return ret;
}

void printf_buff(char *buff,int size)
{
    int i=0;
    for(i=0;i<size;i++)
    {
        printf("%02X",(unsigned char )buff[i]);
        if((i+1)%8==0)
            putchar('\n');
    }
    printf("\n\n\n");
}


void encrpyt_buf(char *raw_buf,char **encrpyt_buf,int len)
{
    DES_key_schedule schedule;
    des_cblock *iv3;
    unsigned char *key=str2hex("8cc72b05705d5c46");
    unsigned char *iv=str2hex("667b02a85c61c786");
    iv3=(des_cblock *)malloc(sizeof(unsigned char)*strlen(iv));
    memcpy(iv3,iv,strlen(iv));
    DES_set_key_unchecked((const_DES_cblock *)&key,&schedule);
    DES_cbc_encrypt(raw_buf,*encrpyt_buf,len,&schedule,iv3,DES_ENCRYPT);
    free(key);
    free(iv3);
}


void decrpyt_buf(char *raw_buf,char **encrypt_buf,int len)
{
    DES_key_schedule schedule;
    des_cblock *iv3;
    unsigned char *key=str2hex("8cc72b05705d5c46");
    unsigned char *iv=str2hex("667b02a85c61c786");
    iv3=(des_cblock *)malloc(sizeof(unsigned char)*strlen(iv));
    memcpy(iv3,iv,strlen(iv));
    DES_set_key_unchecked((const_DES_cblock *)&key,&schedule);
    DES_cbc_encrypt(raw_buf,*encrypt_buf,len,&schedule,iv3,DES_DECRYPT);
    free(key);
    free(iv);
    free(iv3);
}



int main(int argc,char **argv)
{
    char *raw_buf=NULL;
    char *after_padding_buf=NULL;
    int padding_size=0;
    char *en_buf=NULL;
    char *de_buf=NULL;

    raw_buf=(char *)malloc(17);
    strncpy(raw_buf,"life's a struggle",17);
    printf("-----------------------------raw_buf\n");
    printf_buff(raw_buf,18);


    after_padding_buf=padding_buf(raw_buf,17,&padding_size);
    printf("-----------------------------after_padding_buf\n");
    printf_buff(after_padding_buf,padding_size);


    en_buf=(char *)malloc(padding_size);
    encrpyt_buf(after_padding_buf,&en_buf,padding_size);
    printf("-----------------------------encrpyt_buf\n");
    printf_buff(en_buf,padding_size);


    de_buf=(char *)malloc(padding_size);
    decrpyt_buf(en_buf,&de_buf,padding_size);
    printf("-----------------------------decrpyt_buf\n");
    printf_buff(de_buf,padding_size);
    printf("%s\n",de_buf);
    free(raw_buf);
    free(after_padding_buf);
    free(en_buf);
    free(de_buf);
    return 0;
}
[email protected]:~/ssl_examples/des$ gcc des_examples.c -o des_examples -lcrypto
[email protected]:~/ssl_examples/des$ ./des_examples 
-----------------------------raw_buf
6C69666527732061
207374727567676C
6500


-----------------------------after_padding_buf
6C69666527732061
207374727567676C
6500000000000000



-----------------------------encrpyt_buf
2A8013C7058F04E2
C6B6A9FF6362CE26
778C658C28C80F33



-----------------------------decrpyt_buf
6C69666527732061
207374727567676C
6500000000000000



life's a struggle

再次运行:

[email protected]:~/ssl_examples/des$ ./des_examples 
-----------------------------raw_buf
6C69666527732061
207374727567676C
6500


-----------------------------after_padding_buf
6C69666527732061
207374727567676C
6500000000000000



-----------------------------encrpyt_buf
98CB88A854B629AA
E5CE890B8860C6AA
CB61296444AA346E



-----------------------------decrpyt_buf
6C69666527732061
207374727567676C
6500000000000000



life's a struggle

可以看到加密的密文在每次运行时都会改变

参考blog:https://www.jb51.net/article/114363.htm