int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); // 设置加密key AES_KEY aes; AES_set_encrypt_key(key,128,&aes);// 这里填写的128是bit位,128bit=(128/8)bytes=16bytes,这个换算和32bit对应int为内存指针的原理一样。 // 初始化自己的key char key[16]; // 加密函数 void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); # define AES_BLOCK_SIZE 16 // aes.h 71 lines # define AES_ENCRYPT 1 // aes.h 63 lines # define AES_DECRYPT 0 // aes.h 64 lines // 定义一个加密的初始化向量 unsigned char iv[AES_BLOCK_SIZE]; // 加密 AES_cbc_encrypt(raw_buf,encrypt_buf,buf_size,&aes,iv,AES_ENCRYPT); // 解密 AES_cbc_encrypt(raw_buf,encrypt_buf,buf_size,&aes,iv,AES_DECRYPT);
// 16进制的字串转换成16byte存储起来
// hex string to byte in c
const char hexstring[] = "deadbeef10203040b00b1e50", *pos = hexstring;
unsigned char val[12];
size_t count = 0;
/* WARNING: no sanitization or error-checking whatsoever */
for(count = 0; count < sizeof(val)/sizeof(val[0]); count++) {
sscanf(pos, "%2hhx", &val[count]);
pos += 2;
}
printf("0x");
for(count = 0; count < sizeof(val)/sizeof(val[0]); count++)
printf("x", val[count]);
printf("\n");
char *raw_buf = ...;
int raw_size = ...;
char *final_buf = NULL;
int pidding_size = AES_BLOCK_SIZE - (raw_size % AES_BLOCK_SIZE);
int i;
final_buf = (char *)malloc(raw_size+pidding_size);
if (pidding_size!=0) {
memcpy( final_buf, raw_buf, raw_size);
for (i =raw_size;i < (raw_size+pidding_size); i++ ) {
// zero padding算法:
final_buf[i] = 0;
or
// PKCS5Padding算法
final_buf[i] = pading;
}
}
// main.c
#include <aes.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
unsigned char* str2hex(char *str) {
unsigned char *ret = NULL;
int str_len = strlen(str);
int i = 0;
assert((str_len%2) == 0);
ret = (char *)malloc(str_len/2);
for (i =0;i < str_len; i = i+2 ) {
sscanf(str+i,"%2hhx",&ret[i/2]);
}
return ret;
}
char *padding_buf(char *buf,int size, int *final_size) {
char *ret = NULL;
int pidding_size = AES_BLOCK_SIZE - (size % AES_BLOCK_SIZE);
int i;
*final_size = size + pidding_size;
ret = (char *)malloc(size+pidding_size);
memcpy( ret, buf, size);
if (pidding_size!=0) {
for (i =size;i < (size+pidding_size); i++ ) {
ret[i] = 0;
}
}
return ret;
}
void printf_buff(char *buff,int size) {
int i = 0;
for (i=0;i<size;i ++ ) {
printf( "X ", (unsigned char)buff[i] );
if ((i+1) % 8 == 0) {
printf("\n");
}
}
printf("\n\n\n\n");
}
void encrpyt_buf(char *raw_buf, char **encrpy_buf, int len ) {
AES_KEY aes;
unsigned char *key = str2hex("8cc72b05705d5c46f412af8cbed55aad");
unsigned char *iv = str2hex("667b02a85c61c786def4521b060265e8");
AES_set_encrypt_key(key,128,&aes);
AES_cbc_encrypt(raw_buf,*encrpy_buf,len,&aes,iv,AES_ENCRYPT);
free(key);
free(iv);
}
void decrpyt_buf(char *raw_buf, char **encrpy_buf, int len ) {
AES_KEY aes;
unsigned char *key = str2hex("8cc72b05705d5c46f412af8cbed55aad");
unsigned char *iv = str2hex("667b02a85c61c786def4521b060265e8");
AES_set_decrypt_key(key,128,&aes);
AES_cbc_encrypt(raw_buf,*encrpy_buf,len,&aes,iv,AES_DECRYPT);
free(key);
free(iv);
}
int main(int argn, char *argv[] ) {
char *raw_buf = NULL;
char *after_padding_buf = NULL;
int padding_size = 0;
char *encrypt_buf = NULL;
char *decrypt_buf = NULL;
// 1
raw_buf = (char *)malloc(17);
memcpy(raw_buf,"life's a struggle",17);
printf("------------------raw_buf\n");
printf_buff(raw_buf,17);
// 2
after_padding_buf = padding_buf(raw_buf,17,&padding_size);
printf("------------------after_padding_buf\n");
printf_buff(after_padding_buf,padding_size);
// 3
encrypt_buf = (char *)malloc(padding_size);
encrpyt_buf(after_padding_buf,&encrypt_buf, padding_size);
printf("------------------encrypt_buf\n");
printf_buff(encrypt_buf,padding_size);
// 4
decrypt_buf = (char *)malloc(padding_size);
decrpyt_buf(encrypt_buf,&decrypt_buf,padding_size);
printf("------------------decrypt_buf\n");
printf_buff(decrypt_buf,padding_size);
free(raw_buf);
free(after_padding_buf);
free(encrypt_buf);
free(decrypt_buf);
return 0;
}
# SConstruct import glob env = Environment() env["CPPPATH"] = [ '/usr/include/openssl' ] env['LIBPATH'] = [ '/home/abel/lib/openssl-1.0.2f' ] env['CPPDEFINES'] = ['LINUX', '_DEBUG' ] env['CCFLAGS'] = '-g -std=gnu99' env['LIBS'] = [ 'm', 'crypto', 'dl' ] env.Program( target = "./test_aes", source = ( glob.glob( './*.c' ) ) )
:!./test_aes ------------------raw_buf 6C 69 66 65 27 73 20 61 20 73 74 72 75 67 67 6C 65 ------------------after_padding_buf 6C 69 66 65 27 73 20 61 20 73 74 72 75 67 67 6C 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ------------------encrypt_buf DB 63 28 C5 2C 6A 3F 1B FD 4B C5 47 94 4E 24 9D D2 15 4C F2 6B 3B 1D C0 E7 D2 7B D6 1E 78 60 EA ------------------decrypt_buf 6C 69 66 65 27 73 20 61 20 73 74 72 75 67 67 6C 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有