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