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
可以看到加密的密文在每次运行时都会改变
推荐阅读
-
Windows10下使用C语言通过ODBC链接MySQL数据库的方法教程
-
C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解
-
在linux下使用c语言实现MQTT(二.编程实现)
-
Linux下C语言使用openssl库进行加密
-
Linux下C语言使用openssl库加密算法RSA
-
Linux下C语言使用openssl库加密算法DES
-
Linux下C语言使用openssl库加密算法SHA1
-
Linux下C语言使用openssl库加密算法AES
-
Linux下C语言使用openssl库加密算法MD5
-
linux下md5加密(使用openssl库C实现)