1、最近由于项目的需要需要AES128加密,平台是STM32,去网上找了下这类的算法基本都是c语言的,很少有适配STM32f103单片机的,所以打算结合找到的AES加密的c程序,结合到STM32的环境下。
2、这类的c代码有很多,我找的类型是AES128的ECB加密的方式(最简单的一类),下边我把我写的加密解密函数详细的讲解下:
加密函数
void AES_Encrypt(char* pExpressText , char* pCipherText , char* pAeskey)
{
char* str;
uint8_t buWei;
uint16_t aesDataLen; //等待加密的数据
aesDataLen = strlen(pExpressText); //获取加密数据的长度
buWei = 16-aesDataLen%16; //函数是16字节加密的
memset(pExpressText+aesDataLen , buWei, buWei);
aesDataLen = strlen(pExpressText); //获取补位之后的长度
//pExpressText:待加密的明文数据pkey:加密的密匙 str:加密后的数据
str = encrypt(pExpressText, pAeskey); //加密的函数(将加密之后的16字节赋值给指针str)
UART_Printf ("encrypt result: ");
UART_Printf (str);
UART_Printf ("\r\n");
//str:待编码的数据 pCipherText:编码后的数据 aesDataLen 待编码的长度
Base64Encode(str, pCipherText,aesDataLen);//base64编码,此时的数据为24字节
free(str);
UART_Printf("Base64 encoded result: ");
UART_Printf(pCipherText);
UART_Printf("\r\n");
}
{
char* str;
uint8_t buWei;
uint16_t aesDataLen; //等待加密的数据
aesDataLen = strlen(pExpressText); //获取加密数据的长度
buWei = 16-aesDataLen%16; //函数是16字节加密的
memset(pExpressText+aesDataLen , buWei, buWei);
aesDataLen = strlen(pExpressText); //获取补位之后的长度
//pExpressText:待加密的明文数据pkey:加密的密匙 str:加密后的数据
str = encrypt(pExpressText, pAeskey); //加密的函数(将加密之后的16字节赋值给指针str)
UART_Printf ("encrypt result: ");
UART_Printf (str);
UART_Printf ("\r\n");
//str:待编码的数据 pCipherText:编码后的数据 aesDataLen 待编码的长度
Base64Encode(str, pCipherText,aesDataLen);//base64编码,此时的数据为24字节
free(str);
UART_Printf("Base64 encoded result: ");
UART_Printf(pCipherText);
UART_Printf("\r\n");
}
注:上边的加密函数将加密文继续的进行了base64的编码,这个根据自己的实际情况来添加和去除
解密的函数
void AES_Decrypt(char* pExpressText , char* pCipherText , char* pAeskey)
{
char* str2;
uint8_t buIndex , i;
uint16_t aesDataLen; //等待解密的数据长度
char *newstr;
aesDataLen = strlen(pCipherText);
newstr = (char *)malloc(aesDataLen);
memset(newstr , 0 , aesDataLen);
aesDataLen = Base64Decode(newstr , pCipherText, aesDataLen, true);
UART_Printf("decoded result: ");
UART_Printf(newstr);
UART_Printf("\r\n");
//
send_buff:待解密的数据 pkey:密匙 str2:解密后的数据
str2 = decrypt(newstr, pAeskey , aesDataLen);
free(newstr);
//去除尾补码
buIndex = str2[aesDataLen-1];
for(i=0; i<buIndex; i++)
{
if(str2[aesDataLen-i-1] != buIndex)
{
UART_Printf("\nit is a wrong data. \n");
free(str2);
return;
}
else
str2[aesDataLen-i-1] = '\0';
}
strcpy(pExpressText , str2); //:将解密之后的数据给pExpressText指针
free(str2);
UART_Printf ("AES decrypt result: ");
UART_Printf (pExpressText);
UART_Printf ("\r\n");
}
{
char* str2;
uint8_t buIndex , i;
uint16_t aesDataLen; //等待解密的数据长度
char *newstr;
aesDataLen = strlen(pCipherText);
newstr = (char *)malloc(aesDataLen);
memset(newstr , 0 , aesDataLen);
aesDataLen = Base64Decode(newstr , pCipherText, aesDataLen, true);
UART_Printf("decoded result: ");
UART_Printf(newstr);
UART_Printf("\r\n");
//
str2 = decrypt(newstr, pAeskey , aesDataLen);
free(newstr);
//去除尾补码
buIndex = str2[aesDataLen-1];
for(i=0; i<buIndex; i++)
{
if(str2[aesDataLen-i-1] != buIndex)
{
UART_Printf("\nit is a wrong data. \n");
free(str2);
return;
}
else
str2[aesDataLen-i-1] = '\0';
}
strcpy(pExpressText , str2); //:将解密之后的数据给pExpressText指针
free(str2);
UART_Printf ("AES decrypt result: ");
UART_Printf (pExpressText);
UART_Printf ("\r\n");
}
以上的就是加密解密的主要的函数,剩下的一些算法就是用的c语言的集成的函数
注意此加密是AES128的ECB加密,补码的方式为
pkcs5padding
下面附上源码文件
http://pan.baidu.com/s/1dFH0E6t