This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C129ENCPDT:AES 128/192/256位加密

Guru**** 1866200 points
Other Parts Discussed in Thread: AES-128, TM4C129ENCPDT, EK-TM4C129EXL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/581067/rtos-tm4c129encpdt-aes-128-192-256-bit-encryption

器件型号:TM4C129ENCPDT
主题中讨论的其他部件:AES-128EK-TM4C129EXL

工具/软件:TI-RTOS

您好!

我需要执行1KB 数据才能使用 AES 进行加密。 我找到了 AES-128加密的 API 函数。 但 API 不起作用。

这里是该函数。

//前 eward SBOX
const unsigned char SBOX[256]={
//0 1 2. 3. 4 5. 6. 7. 8 9. A B C D e f
0x63、0x7c、0x77、0x7B、0xF2、 0x6b、0x6f、0xc5、0x30、0x01、 0x67、0x2b、0xFE、0xd7、0xab、 0x76、//0
0xca、0x82、0xc9、0x7d、 0xfa、0x59、0x47、0xf0、0xad、 0xd4、0xa2、0xaf、0x9C、0xa4、 0x72、0xc0、//1
b7、0xFD、0x93、 0x26、0x36、0x3f、0xf7、0xcc、 0x34、0xA5、0xe5、0xF1、0x71、 0xD8、0x31、0x15、/2
0x04、0xc7、 0x23、0xc3、0x18、0x96、0x05、 0x9a、0x07、0x12、0x80、0x2、 0xeb、0x27、0xb2、0x75、//3
0x09、 0x83、0x2C、0x1a、0x1b、0x6e、 0x5a、0xa0、0x52、0x3b、0xd6、 0xb3、0x29、0xe3、0x2F、0x84、 //4
0x53、0xD1、0x00、0xED、0x20、 0xFC、0xb1、0x5b、0x6a、0xcb、 0xbe、0x39、0x4a、0x4c、0x58、 0xCF、//5
0xd0、0xef、0xAA、0xfb、 0x43、0x4d、0x33、0x85、0x45、 0xf9、0x02、0x7f、0x50、0x3c、 0x9F、0xa8、//6
0x51、0xa3、0x40、 0x8F、0x92、0x9d、0x38、0xf5、 0xbc、0xb6、0xda、0x21、0x10、 0xFF、0xF3、0xd2、//7
0xcd、0x0c、 0x13、0xec、0x5f、0x97、0x44、 0x17、0xc4、0xa7、0x7E、0x3D、 0x64、0x5d、0x19、0x73、//8
0x60、 0x81、0x4f、0xdc、0x22、0x2a、 0x90、0x88、0x46、0xee、0xb8、 0x14、0xDE、0x5e、0x0B、0xdb、 //9
0xe0、0x32、0x3a、0x0a、0x49、 0x06、0x24、0x5c、0xC2、0xd3、 0xac、0x62、0x91、0x95、0xe4、 0x79、//A
0xe7、0xc8、0x37、0x6d、 0x8d、0xd5、0x4e、0xa9、0x6c、 0x56、0xf4、0xEA、0x65、0x7a、 0xAE、0x08、//B
0xBA、0x78、0x25、 0x2E、0x1c、0xa6、0xb4、0xc6、 0xe8、0xdd、0x74、0x1f、0x4b、 0xBD、0x8b、0x8a、// C
0x70、0x3E、 0xb5、0x66、0x48、0x03、0xf6、 0x0E、0x61、0x35、0x57、0xb9、 0x86、0xc1、0x1d、0x9e、//D
0xe1、 0xf8、0x98、0x11、0x69、0xd9、 0x8E、0x94、0x9b、0x1E、0x87、 0xe9、0xce、0x55、0x28、0xdf、 //E
0x8c、0xa1、0x89、0x0d、0xbf、 0xe6、0x42、0x68、0x41、0x99、 0x2D、0x0F、0xb0、0x54、0xbb、 0x16};//F

//反向 SBOX
const unsigned char rsbox[256]=
{0x52、0x09、0x6a、0xd5、0x30、 0x36、0xA5、0x38、bbf、0x40、 0xa3、0x9e、0x81、0xf3、0xd7、 0xfb
、0x7c、0xe3、0x39、0x82、 0x9b、0x2F、0xff、0x87、0x34、 0x8E、0x43、0x44、0xc4、0xDE、 0xe9、0xcb
、0x54、0x7B、0x94、 0x32、0xa6、0xC2、0x23、0x3D、 0xee、0x4c、0x95、0x0B、0x42、 0xfa、0xc3、0x4e
、0x08、0x2e、 0xa1、0x66、0x28、0xd9、0x24、 0xb2、0x76、0x5b、0xa2、0x49、 0x6d、0x8b、0xD1、0x25
、0x72、 0xf8、0xf6、0x64、0x86、0x68、 0x98、0x16、0xd4、0xa4、0x5c、 0xcc、0x5d、0x65、b6、0x92
、 0x6c、0x70、0x48、0x50、0xFD、 0xED、0xb9、0xda、0x5e、0x15、 0x46、0x57、0xa7、0x8d、0x9d、 0x84
、0x90、0xd8、0xab、0x00、 0x8c、0xbc、0xd3、0x0a、0xf7、 0xe4、0x58、0x05、0xb8、0xb3、 0x45、0x06
、0xd0、0x2C、0x1E、 0x8F、0xca、0x3f、0x0F、0x02、 0xc1、0xaf、0xbd、0x03、0x01、 0x13、0x8a、0x6b
、0x3a、0x91、 0x11、0x41、0x4f、0x67、0xdc、 0xEA、0x97、0xF2、0xCF、0xce、 0xf0、0xb4、0xe6、0x73
、0x96、 0xac、0x74、0x22、0xe7、0xAD、 0x35、0x85、0x2、0xf9、0x37、 0xe8、0x1c、0x75、0xdf、0x6e
、 0x47、0xF1、0x1a、0x71、0x1d、 0x29、0xc5、0x89、0x6f、0xb7、 0x62、0x0E、0xAA、0x18、0xBE、 0x1b
、0xFC、0x56、0x3E、0x4b、 0xc6、0xd2、0x79、0x20、0x9a、 0xdb、0xc0、0xFE、0x78、0xcd、 0x5a、0xf4
、0x1f、0xdd、0xa8、 0x33、0x88、0x07、0xc7、0x31、 0xb1、0x12、0x10、0x59、0x27、 0x80、0xec、0x5f
、0x60、0x51、 0x7f、0xa9、0x19、0xb5、0x4a、 0x0D、0x2D、0xe5、0x7a、0x9f、 0x93、0xc9、0x9C、0xef
、0xa0、 0xe0、0x3b、0x4d、0xae、0x2a、 0xf5、0xb0、0xc8、0xeb、0xbb、 0x3c、0x83、0x53、0x99、0x61
、 0x17、0x2b、0x04、0x7E、0xBA、 0x77、0xd6、0x26、0x1、0x69、 0x14、0x63、0x55、0x21、0x0c、 0x7d};

//舍入常数
const unsigned char Rcon[10]={
0x01、0x02、0x04、0x08、0x10、 0x20、0x40、0x80、0x1b、0x36};


//在伽罗瓦字段
中乘以2 unsigned char Galois_mul2 (unsigned char value)
{
signed char temp;
//转换为 signed value
temp =(signed char) value;
//如果 MSB 为1,则这将通过1的
temp = temp >> 7来扩展和填充 temp 变量;
//使用减小变量
temp = temp & 0x1b;
//最后移动并减小值
返回值(((value << 1)^temp);
}

// AES 加密和解密功能
//代码针对存储器(闪存和 RAM)进行了优化
//将加密和解密相结合会导致执行速度变慢
//但比分隔的2个函数小得多
//此函数仅实现 AES-128加密和解密(
此代码不支持 AES-192和// AES-256)
void AES_enc_解码(unsigned char *状态、unsigned char *密钥、unsigned char dir)
{
unsigned char buf1、buf2、buf3、buf4、round、 一;

//如果解密
if (dir){
//在开始解密之前计算最后一个加密密钥
对于(round = 0;round < 10;round++){
//按键计划
key[0]= SBOX[key[13]^key[0]^Rcon[round];
key[1]= SBOX[key[14]^key[1];
key[2]= SBOX[key[15]^key[2];
key[3]= SBOX[key[12]^key[3];
对于(i=4;i<16;i++){
key[i]= key[i]^ key[I-4];
}
}

//First Addroundkey
对于(i = 0;i < 16;i++){
state[i]=state[i]^ key[i];
}
}

//(
round = 0;round < 10;round++){的主循环
if (dir){
//反转键调度
对于(i=15;i>3;--i){
key[i]= key[i]^ key[i-4];
}
key[0]= SBOX[key[13]^key[0]^Rcon[9-round];
key[1]= SBOX[key[14]^key[1];
key[2]= SBOX[key[15]^key[2];
key[3]= SBOX[key[12]^key[3];
} 否则{
对于(i = 0;i < 16;i++){
//使用移位行 i+5 mod 16
state[i]=SBOX[state[i]^ key[i];
}
//移动行
buf1 = state[1];
STATE [1]= STATE [5];
STATE [5]= STATE [9];
STATE [9]= STATE [13];
STATE [13]= buf1;

buf1 = state[2];
buf2 =状态[6];
STATE [2]= STATE [10];
STATE [6]= STATE [14];
STATE [10]= buf1;
STATE [14]=buf2;

buf1 = state[15];
STATE [15]= STATE [11];
STATE [11]= STATE [7];
STATE [7]= STATE [3];
STATE [3]= buf1;
}
//mixcol - inv 混合
if ((round > 0 && dir)||(round < 9 &&!dir)){
对于(i=0;i <4;i++){
buf4 =(I << 2);
if (dir){
//预计算解密
buf1 =伽罗瓦_mul2 (伽罗瓦_mul2 (state[buf4]^state[buf4+2]));
buf2 =伽罗瓦_mul2 (伽罗瓦_mul2 (state[buf4+1]^state[buf4+3]));
state[buf4]^= buf1;state[buf4+1]^= buf2;state[buf4+2]^= buf1;state[buf4+3]^= buf2;
}
//在所有情况下
buf1 = state[buf4]^ state[buf4+1]^ state[buf4+2]^ state[buf4+3];
buf2 = state[buf4];
buf3 = state[buf4]^state[buf4+1];buf3 =伽罗瓦_mul2 (buf3);state[buf4]= state[buf4]^ buf3 ^ buf1;
buf3 = state[buf4+1]^state[buf4+2];buf3 =伽罗瓦_mul2 (buf3);state[buf4+1]= state[buf4+1]^ buf3 ^ buf1;
buf3 = state[buf4+2]^state[buf4+3];buf3 =伽罗瓦_mul2 (buf3);state[buf4+2]= state[buf4+2]^ buf3 ^ buf1;
buf3 = state[buf4+3]^buf2; buf3=伽 罗瓦_mul2 (buf3);state[buf4+3]= state[buf4+3]^ buf3 ^ buf1;
}
}

if (dir){
//库存移位行
//行1
buf1 = state[13];
STATE [13]= STATE [9];
STATE [9]= STATE [5];
STATE [5]= STATE [1];
STATE [1]= buf1;
//行2
buf1 = state[10];
buf2 =状态[14];
STATE [10]= STATE [2];
STATE [14]= STATE [6];
STATE [2]= buf1;
STATE [6]= buf2;
//行3
buf1 = state[3];
STATE [3]= STATE [7];
STATE [7]= STATE [11];
STATE [11]= STATE [15];
STATE [15]= buf1;

对于(i = 0;i < 16;i++){
//使用移位行 i+5 mod 16
state[i]=rsbox[state[i]^ key[i];
}
}否则{
//按键计划
key[0]= SBOX[key[13]^key[0]^Rcon[round];
key[1]= SBOX[key[14]^key[1];
key[2]= SBOX[key[15]^key[2];
key[3]= SBOX[key[12]^key[3];
对于(i=4;i<16;i++){
key[i]= key[i]^ key[I-4];
}
}

如果(!dir){//
最后找到的关键字
对于(i = 0;i < 16;i++){
//使用移位行 i+5 mod 16
state[i]=state[i]^ key[i];
} // ENF for
}// end if (!dir)
}// end 函数

因为我必须加密较大的数据、并且 AES-128只加密16字节。 因此、我使用 for loop 对所有数据进行加密和解密。

for (i=0;<strlen(str1); i=i+16 )

   AES_enc_dec (&str1[i]、KEY、1);  

for (i=0;<strlen(str1); i=i+16 )

    AES_enc_dec (&str1[i]、KEY、0);

我给出了16字节的密钥。 和36字节字符串值

我所面对的问题是:

(1)此功能仅支持 AES 128、我还需要进行 AES 192/256加密。

(2) 加密后、如果我从另一个工具解密该加密数据、则使用相同的密钥、它不会提供 currect 数据。

(3) 解密后、它也会更改密钥值、这不应该完成。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以看到一个通用示例、但 TM4C129ENCPDT 器件具有硬件加速器。 如果您还没有 、请下载 TivaWare 并查看以下位置中的示例:"c:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c129exl"使用 ROM 函数的示例"ASP_CBC_encrypt"

    ROM_AESDataProcess()是一个加密较大数据块的示例。