GF(2^8)域中矩阵乘法函数计算结果不符的排查与解决请求
问题分析与修复方案
嘿,我一眼就瞅出你代码里的核心问题了——你直接在输入矩阵state上原地修改,导致后续行的计算用到了被修改过的中间值,而不是原始的输入数据,这才让结果和预期不符。
问题到底出在哪?
你的mul函数逻辑是要实现变换矩阵(matrix1)和输入矩阵(matrix2)的GF(2^8)乘法,但在循环里,你计算完第0行的新值后直接覆盖了state[0][i]的原始值。等你计算第1、2、3行的时候,本该用原始的state[0][i],结果却用到了刚算出来的新值,整个计算链条全乱套了,结果肯定不对啊!
比如看这段代码:
state [0][i] = byteProduct(0x02 ,state[0][i]) ^ ...; // 覆盖了原始state[0][i] state [1][i] = state[0][i] ^ ...; // 这里的state[0][i]已经不是原来的输入了!
怎么修复?
最直接的解决办法就是先搞个临时矩阵存计算结果,等所有行都计算完,再把临时矩阵的值复制回原state。这样所有计算都基于原始的输入数据,不会被中间修改干扰。
修改后的完整mul函数
void mul(uint8_t state[4][4]) { // 先创建临时矩阵,用来存计算后的结果,避免覆盖原始数据 uint8_t temp[4][4]; for(unsigned short i = 0; i < 4; i++) { // 所有计算都用原始state的值,结果丢进temp里 temp[0][i] = byteProduct(0x02, state[0][i]) ^ byteProduct(0x03, state[1][i]) ^ state[2][i] ^ state[3][i]; temp[1][i] = state[0][i] ^ byteProduct(0x02, state[1][i]) ^ byteProduct(0x03, state[2][i]) ^ state[3][i]; temp[2][i] = state[0][i] ^ state[1][i] ^ byteProduct(0x02, state[2][i]) ^ byteProduct(0x03, state[3][i]); temp[3][i] = byteProduct(0x03, state[0][i]) ^ state[1][i] ^ state[2][i] ^ byteProduct(0x02, state[3][i]); } // 把临时矩阵的结果复制回原state for(int row = 0; row < 4; row++) { for(int col = 0; col < 4; col++) { state[row][col] = temp[row][col]; } } }
额外验证
对了,你的byteProduct函数是完全正确的,它完美实现了GF(2^8)域的乘法(就是AES用的那个有限域规则),不需要改。用修改后的mul函数跑你给的matrix2输入,就能得到你预期的结果:
0x5f 0x72 0x64 0x15
0x57 0xf5 0xbc 0x92
0xf7 0xbe 0x3b 0x29
0x1d 0xb9 0xf9 0x1a
内容的提问来源于stack exchange,提问作者Nilesh Kumar
相关产品推荐
相关产品推荐

