openssl之aes加密(AES_cbc_encrypt 與 AES_encrypt 的程式設計案例)
阿新 • • 發佈:2019-02-15
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<openssl/aes.h>
#define AES_BITS 128
#define MSG_LEN 128
int aes_encrypt(char*in,char* key,char*out)//, int olen)可能會設定buf長度
{
if(!in||!key ||!out)return0;
unsignedchar iv[AES_BLOCK_SIZE];//加密的初始化向量
for(int i=0; i<AES_BLOCK_SIZE
iv[i]=0;
AES_KEY aes;
if(AES_set_encrypt_key((unsignedchar*)key,128,&aes)<0)
{
return0;
}
int len=strlen(in);//這裡的長度是char*in的長度,但是如果in中間包含'\0'字元的話
//那麼就只會加密前面'\0'前面的一段,所以,這個len可以作為引數傳進來,記錄in的長度
//至於解密也是一個道理,光以'\0'來判斷字串長度,確有不妥,後面都是一個道理。 AES_cbc_encrypt((unsigned
return1;
}
int aes_decrypt(char*in,char* key,char*out)
{
if(!in||!key ||!out)return0;
unsignedchar iv[AES_BLOCK_SIZE];//加密的初始化向量
for(int i=0; i<AES_BLOCK_SIZE;++i)//iv一般設定為全0,可以設定其他,但是加密解密要一樣就行
iv[i]=0;
AES_KEY aes;
if(AES_set_decrypt_key((unsigned
{
return0;
}
int len=strlen(in);
AES_cbc_encrypt((unsignedchar*)in,(unsignedchar*)out, len,&aes, iv, AES_DECRYPT);
return1;
}
int main(int argc,char*argv[])
{
char sourceStringTemp[MSG_LEN];
char dstStringTemp[MSG_LEN];
memset((char*)sourceStringTemp,0,MSG_LEN);
memset((char*)dstStringTemp,0,MSG_LEN);
strcpy((char*)sourceStringTemp,"123456789 123456789 123456789 12a");
//strcpy((char*)sourceStringTemp, argv[1]);
char key[AES_BLOCK_SIZE];
int i;
for(i =0; i <16; i++)//可自由設定金鑰
{
key[i]=32+ i;
}
if(!aes_encrypt(sourceStringTemp,key,dstStringTemp))
{
printf("encrypt error\n");
return-1;
}
printf("enc %d:",strlen((char*)dstStringTemp));
for(i=0;dstStringTemp[i];i+=1){
printf("%x",(unsignedchar)dstStringTemp[i]);
}
memset((char*)sourceStringTemp,0,MSG_LEN);
if(!aes_decrypt(dstStringTemp,key,sourceStringTemp))
{
printf("decrypt error\n");
return-1;
}
printf("\n");
printf("dec %d:",strlen((char*)sourceStringTemp));
printf("%s\n",sourceStringTemp);
for(i=0;sourceStringTemp[i];i+=1){
printf("%x",(unsignedchar)sourceStringTemp[i]);
}
printf("\n");
return0;
} 上圖是執行程式的測試結果。可見加密解密已經完成。