#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) return 0; unsigned char iv[AES_BLOCK_SIZE];//加密的初始化向量 for(int i=0; i<AES_BLOCK_SIZE; ++i)//iv一般设置为全0,可以设置其他,但是加密解密要一样就行 iv[i]=0; AES_KEY aes; if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) { return 0; } int len=strlen(in);//这里的长度是char*in的长度,但是如果in中间包含'\0'字符的话
//那么就只会加密前面'\0'前面的一段,所以,这个len可以作为参数传进来,记录in的长度
//至于解密也是一个道理,光以'\0'来判断字符串长度,确有不妥,后面都是一个道理。 AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT); return 1; } int aes_decrypt(char* in, char* key, char* out) { if(!in || !key || !out) return 0; unsigned char 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 char*)key, 128, &aes) < 0) { return 0; } int len=strlen(in); AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT); return 1; } 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",(unsigned char)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",(unsigned char)sourceStringTemp[i]); } printf("\n"); return 0; }

int aes_encrypt(char* in, char* key, char* out)//, int olen) { if (! in || ! key || ! out ) return 0 ; AES_KEY aes ; if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) { return 0 ; } int len = strlen ( in ), en_len = 0 ; while ( en_len < len ) //输入输出字符串够长,并且是AES_BLOCK_SIZE的整数倍,需要严格限制 { AES_encrypt (( unsigned char *) in , ( unsigned char *) out , & aes ); in += AES_BLOCK_SIZE ; out += AES_BLOCK_SIZE ; en_len += AES_BLOCK_SIZE ; } return 1 ; } int aes_decrypt ( char * in , char * key , char * out ) { if (! in || ! key || ! out ) return 0 ; AES_KEY aes ; if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0) { return 0 ; } int len = strlen ( in ), en_len = 0 ; while ( en_len < len ) { AES_decrypt (( unsigned char *) in , ( unsigned char *) out , & aes ); in += AES_BLOCK_SIZE ; out += AES_BLOCK_SIZE ; en_len += AES_BLOCK_SIZE ; } return 1 ; }
