主题中讨论的其他部件:AES-128、 EK-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) 解密后、它也会更改密钥值、这不应该完成。