AES128 ECB加密pkcs5padding补码

本文介绍了一种在STM32平台上实现AES128 ECB模式加密和解密的方法,并提供了详细的函数实现步骤。文章还讨论了加密前后的数据处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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");
注:上边的加密函数将加密文继续的进行了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");
}

以上的就是加密解密的主要的函数,剩下的一些算法就是用的c语言的集成的函数

注意此加密是AES128的ECB加密,补码的方式为pkcs5padding

下面附上源码文件
http://pan.baidu.com/s/1dFH0E6t

在Delphi中,要使用AES-128-ECB(电子密码本模式加密,配合PKCS7Padding(等长填充),同时对加密后的结果进行Base64编码,可以按照以下步骤操作: 1. **设置环境**: - 引入必要的库:`System.NetEncoding`, `System.Security.Cryptography` (从Delphi 2007起自带AES支持)。 2. **生成16字节的随机密钥(Key)**: ```delphi var Key: TBytes; begin SetLength(Key, 16); RandomMemory(Key, Length(Key)); // 生成16字节的随机密钥 end; ``` 3. **创建AES加密器**: ```delphi var AesEncryptor: IAsymmetricAlgorithm; begin AesEncryptor := CreateOATObject('Algoritma.AES', 'AESManaged') as IAsymmetricAlgorithm; AesEncryptor.Key := Key; AesEncryptor.Mode := TAlgorithmMode.ECB; // ECB模式 end; ``` 4. **应用PKCS5Padding**: ```delphi function PKCS5Pad(input: TBytes; blockSize: Integer): TBytes; const padChar = $FF; begin result := input; if Length(input) mod blockSize <> 0 then raise Exception.CreateFmt('Input too short for padding (%d bytes, %d block)', [Length(input), blockSize]); SetLength(result, Length(input) + blockSize - Length(input) mod blockSize); FillChar(result[Length(input) ..], blockSize, padChar); end; ``` 5. **加密数据**: ```delphi var Input: string; EncryptedData: TBytes; begin Input := 'Your Data'; // 要加密的数据 EncryptedData := PKCS5Pad(Encoding.UTF8.GetBytes(Input), AesEncryptor.BlockSize); end; ``` 6. **Base64编码**: ```delphi var Base64Encoded: string; begin Base64Encoded := EncodeBase64(EncryptedData); end; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForNi福尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值