Openssl配列の暗号化復号化の完全な実装コード-
3020 ワード
この例は、Cで実装された1つの配列を暗号化し、2番目の配列に暗号化し、別の配列の完全な実装コードに復号する.
#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('
');
}
/*
* 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
");
return -1;
}
inl=in_len;
rv = EVP_EncryptUpdate(&ctx,out_enc,&outl,in_enc,in_len);//
if(rv != 1)
{
printf("Err
");
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("
");
}
/*
* 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("
");
}
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
",dec_len);
disp(dec,dec_len);
DecryptBuffer(key,iv,dec,out,dec_len,&len2);
disp(out,len2);
printf(" :%d
",len2);
return 0;
}