歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenSSL對數組加密解密的完整實現代碼

本例是用C實現的對一個數組進行加密,加密到第二個數組,然後解密到另一個數組的完整實現代碼。

#include <stdio.h>
#include <string.h>


#include "openssl/evp.h"
#include "openssl/x509.h"


static void disp(void * pbuf,int size)
{ int i=0;
 for( i=0;i<size;i++)
  printf("%02x ",*((unsigned char *)pbuf+i));
 putchar('\n');
}

/*
 * key:加密密鑰,一般設置位24,不知為啥
 * iv:加密初始向量
 * in_enc:明文數組,輸入數組
 * out_enc:加密後的數組,輸出密文數組
 * in_len:明文長度
 * out_len:密文長度
 * */
//加密函數
int  EncryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_enc, unsigned char *out_enc,int in_len,int *out_len)
{
;
 int outl;  //第一次使用update加密的數據長度
 int outl2; //剩余的字段,經過final填充後的長度
 int inl;
 int rv;

 EVP_CIPHER_CTX ctx;

 EVP_CIPHER_CTX_init(&ctx); //初始化ctx

 rv = EVP_EncryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv); //設置密碼算法、key和iv
 if(rv != 1)
 {
  printf("Err\n");
  return -1;
 }

 inl=in_len;
  rv = EVP_EncryptUpdate(&ctx,out_enc,&outl,in_enc,in_len);//加密
 if(rv != 1)
 {
  printf("Err\n");
  return -1;
 }

 //加密結束
 rv = EVP_EncryptFinal_ex(&ctx,out_enc+outl,&outl2);
 if(rv != 1)
 {
  EVP_CIPHER_CTX_cleanup(&ctx);
  return -1;
 }

 *out_len=outl+outl2;
 EVP_CIPHER_CTX_cleanup(&ctx); //清除EVP加密上下文環境
 printf("加密已完成\n");

}
/*
 * key:加密密鑰,一般設置位24,不知為啥
 * iv:加密初始向量
 * in_dec:密文數組,輸入數組
 * out_dec:解密後的數組,輸出數組
 * in_len:密文長度
 * out_len:明文長度
 * */
//解密函數
int DecryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_dec, unsigned char *out_dec,int in_len,int *out_len)
{
 int outl;  //第一次使用update解密的數據長度
 int outl2; //剩余的字段,經過final解密並去除填充後的長度
 int rv;

 EVP_CIPHER_CTX ctx;
 //初始化ctx
 EVP_CIPHER_CTX_init(&ctx);
 //設置解密的算法、key和iv
 rv = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);
 if(rv != 1)
 {
  EVP_CIPHER_CTX_cleanup(&ctx);
  return -1;
 }

 //循環讀取原文,解密後後保存到明文文件。
 rv = EVP_DecryptUpdate(&ctx,out_dec,&outl,in_dec,in_len);//解密
 if(rv != 1)
 {
  EVP_CIPHER_CTX_cleanup(&ctx);
  return -1;
 }

 //解密結束
 rv = EVP_DecryptFinal_ex(&ctx,out_dec+outl,&outl2);

  if(rv != 1)
 {
  EVP_CIPHER_CTX_cleanup(&ctx);
  return -1;
 }
 *out_len=outl+outl2;
 EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文環境
 printf("解密已完成\n");
}


int main()
{
 int len=128+4;
 int dec_len,len2;
 unsigned char key[EVP_MAX_KEY_LENGTH]; //保存密鑰的數組
 unsigned char iv[EVP_MAX_KEY_LENGTH]; //保存初始化向量的數組
   //EVP加密上下文環境
 unsigned char out[len+EVP_MAX_KEY_LENGTH]; //保存加密後明文的緩沖區數組
 unsigned char dec[len+EVP_MAX_KEY_LENGTH]; //保存解密後明文的緩沖區數組
 unsigned char in[len+EVP_MAX_KEY_LENGTH];   //保存原文的緩沖區

 int i=0;
 //設置key和iv
 for(i=0;i<8;i++)
 {
  key[i]=i;
 }

 for(i=0;i<8;i++)
 {
  iv[i]=i;
 }
 for(i=0;i<len;i++)
 {
  in[i]=i;
 }
 disp(in,len);
 EncryptBuffer(key,iv,in,dec,len,&dec_len);
 printf("dec_len:%d\n",dec_len);
 disp(dec,dec_len);

 DecryptBuffer(key,iv,dec,out,dec_len,&len2);
 disp(out,len2);
 printf("解密候數據長度:%d\n",len2);
 return 0;
}

OpenSSL 的詳細介紹:請點這裡
OpenSSL 的下載地址:請點這裡

相關閱讀:

OpenSSL TLS心跳讀遠程信息洩露漏洞 (CVE-2014-0160) http://www.linuxidc.com/Linux/2014-04/99741.htm

OpenSSL嚴重bug允許攻擊者讀取64k內存,Debian半小時修復 http://www.linuxidc.com/Linux/2014-04/99737.htm

OpenSSL “heartbleed” 的安全漏洞 http://www.linuxidc.com/Linux/2014-04/99706.htm

通過OpenSSL提供FTP+SSL/TLS認證功能,並實現安全數據傳輸 http://www.linuxidc.com/Linux/2013-05/84986.htm

Copyright © Linux教程網 All Rights Reserved