stm32 AES-128-ECB PKCS7Padding 密钥10字节
时间: 2024-01-18 12:02:33 浏览: 180
对于这个问题,由于AES-128采用的是128位的密钥,因此无法使用10字节的密钥进行加密。您需要使用16字节的密钥才能进行AES-128的加密操作。
同时,ECB模式需要对数据进行分块,每个分块的大小必须为16字节,因此如果您要加密的数据不是16字节的倍数,需要进行PKCS7Padding填充操作,将数据填充到16字节的倍数。填充的字节的值为需要填充的字节数。
您可以使用STM32的HAL库中提供的AES加密函数进行加密,同时使用自己实现的PKCS7Padding填充函数对数据进行填充。
相关问题
stm32 AES-128-ECB PKCS7Padding
在STM32上进行AES-128-ECB加解密并进行PKCS7填充,可以采用以下步骤:
1. 配置AES模块:使用HAL库中的`AES_Init`函数对AES模块进行配置,设置加密模式为ECB,密钥长度为128位。
2. 设置密钥:使用HAL库中的`AES_SetKey`函数设置加密密钥。
3. 进行PKCS7填充:对需要加密的数据进行PKCS7填充。
4. 加密:使用HAL库中的`AES_Encrypt`函数对填充后的数据进行加密。
5. 进行PKCS7解填充:对加密后的数据进行PKCS7解填充。
6. 解密:使用HAL库中的`AES_Decrypt`函数对解填充后的数据进行解密。
具体实现代码如下:
```c
#include "stm32f4xx_hal.h"
#include <string.h>
#define AES_KEY_SIZE 16
#define AES_BLOCK_SIZE 16
void AES128_ECB_PKCS7Padding_Encrypt(uint8_t *pInData, uint32_t inDataLen, uint8_t *pOutData, uint32_t *pOutDataLen, uint8_t *pKey)
{
AES_HandleTypeDef aes_handle;
uint8_t padding_value;
uint32_t padded_data_len;
// 初始化AES模块
aes_handle.Instance = AES;
aes_handle.Init.KeySize = AES_KEYSIZE_128B;
aes_handle.Init.DataType = AES_DATATYPE_BYTES;
aes_handle.Init.pKey = pKey;
aes_handle.Init.Algorithm = AES_ALGORITHM_ECB;
HAL_AES_Init(&aes_handle);
// 计算填充后的数据长度
padding_value = AES_BLOCK_SIZE - inDataLen % AES_BLOCK_SIZE;
padded_data_len = inDataLen + padding_value;
// 填充数据
uint8_t padded_data[padded_data_len];
memcpy(padded_data, pInData, inDataLen);
memset(padded_data + inDataLen, padding_value, padding_value);
// 加密数据
uint8_t encrypted_data[padded_data_len];
for (uint32_t i = 0; i < padded_data_len; i += AES_BLOCK_SIZE)
{
HAL_AES_Encrypt(&aes_handle, padded_data + i, AES_BLOCK_SIZE, encrypted_data + i, HAL_MAX_DELAY);
}
*pOutDataLen = padded_data_len;
memcpy(pOutData, encrypted_data, padded_data_len);
// 反向填充
for (int i = padded_data_len - 1; i >= padded_data_len - padding_value; i--)
{
if (pOutData[i] != padding_value)
{
*pOutDataLen = 0;
break;
}
else
{
*pOutDataLen = i;
}
}
}
void AES128_ECB_PKCS7Padding_Decrypt(uint8_t *pInData, uint32_t inDataLen, uint8_t *pOutData, uint32_t *pOutDataLen, uint8_t *pKey)
{
AES_HandleTypeDef aes_handle;
uint8_t padding_value;
// 初始化AES模块
aes_handle.Instance = AES;
aes_handle.Init.KeySize = AES_KEYSIZE_128B;
aes_handle.Init.DataType = AES_DATATYPE_BYTES;
aes_handle.Init.pKey = pKey;
aes_handle.Init.Algorithm = AES_ALGORITHM_ECB;
HAL_AES_Init(&aes_handle);
// 解密数据
uint8_t decrypted_data[inDataLen];
for (uint32_t i = 0; i < inDataLen; i += AES_BLOCK_SIZE)
{
HAL_AES_Decrypt(&aes_handle, pInData + i, AES_BLOCK_SIZE, decrypted_data + i, HAL_MAX_DELAY);
}
// 反向填充
padding_value = decrypted_data[inDataLen - 1];
for (int i = inDataLen - 1; i >= inDataLen - padding_value; i--)
{
if (decrypted_data[i] != padding_value)
{
*pOutDataLen = 0;
break;
}
else
{
*pOutDataLen = i;
}
}
// 复制解密后的数据
memcpy(pOutData, decrypted_data, *pOutDataLen);
}
```
在使用时,可以调用`AES128_ECB_PKCS7Padding_Encrypt`函数进行加密,调用`AES128_ECB_PKCS7Padding_Decrypt`函数进行解密。其中,参数`pInData`为需要加解密的数据,`inDataLen`为数据长度,`pOutData`为加解密后的数据,`pOutDataLen`为加解密后的数据长度,`pKey`为加解密密钥。
请用shell OpenSSL写一段aes-128-ecb pkcs5padding的加解密代码
好的,这里是使用Shell OpenSSL写的aes-128-ecb pkcs5padding的加解密代码:
加密代码:
```
#!/bin/bash
# 待加密的字符串
orig_str="Hello, world!"
# 加密的密钥,16字节
key="1234567890123456"
# 填充方式
padding="pkcs5"
# 使用 echo 命令将原始字符串转成二进制数据并进行加密,输出加密后的二进制数据
echo -n "$orig_str" | openssl enc -aes-128-ecb -K "$key" -$padding -nopad | xxd -p
```
解密代码:
```
#!/bin/bash
# 待解密的二进制数据
cipher_hex="3d4b739a4b0f59a72cd7debacecca8c343b2213812c0e9b9a05852d324589cea"
# 解密的密钥,16字节
key="1234567890123456"
# 填充方式
padding="pkcs5"
# 将两个16进制数拼接成一个字节,并进行解密,输出解密后的字符串
echo -n "$cipher_hex" | sed 's/\(..\)/\1 /g' | xxd -r -p | openssl enc -d -aes-128-ecb -K "$key" -$padding
```
注意,为了避免在加解密过程中引入额外的字符,需要注意使用echo命令输出时使用-n参数,即不自动添加换行符。在加密后输出的结果是16进制的字符串,可以使用xxd命令进行转换。在解密前需要将16进制的字符串转换成二进制数据,然后再进行解密。在转换时需要注意替换掉16进制字符串中的空格。
阅读全文