Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

加密结果好像跟标准SM4不一样 #1

Open
zdpdz opened this issue Mar 13, 2020 · 6 comments
Open

加密结果好像跟标准SM4不一样 #1

zdpdz opened this issue Mar 13, 2020 · 6 comments

Comments

@zdpdz
Copy link

zdpdz commented Mar 13, 2020

加密结果好像跟标准SM4不一样

@ohhoo
Copy link
Owner

ohhoo commented Mar 14, 2020

因为

加密结果好像跟标准SM4不一样

因为在每一轮与下一轮进行编码抵消之后会引入32bit的随机向量与矩阵乘积,所以结果会有不一样。在肖雅莹原论文中没有看到这个冗余量在哪里抵消,所以我认为结果跟标准的不同。
我的代码实现是参照潘文伦的论文进行实现的。也可能是我代码出了问题,如果你有什么发现,欢迎指正。

@zdpdz
Copy link
Author

zdpdz commented Mar 14, 2020

最后不是对结果解码了吗?您自己做了测试吗,解密出来的结果是否正确?

@ohhoo
Copy link
Owner

ohhoo commented Mar 14, 2020

最后不是对结果解码了吗?您自己做了测试吗,解密出来的结果是否正确?
解码后的结果与标准不同,我还在找原因。

@zdpdz
Copy link
Author

zdpdz commented Mar 14, 2020

我做了测试,首先,加密结果与标准的不同,其次,我将轮密钥反过来生成解密查找表,得到的结果也不对。
这是我的test.cpp

unsigned int mainKey[4] =
{ 0x01234567,0x89abcdef,
0xfedcba98,0x76543210 };
unsigned int plainText[4] =
{ 0x01234567,0x89abcdef,
0xfedcba98,0x76543210 };
unsigned int cipher[4] =
{ 0,0,
0,0 };
creatAffineTable(mainKey);
wbSM4En(plainText, cipher);
cout << hex << cipher[0] << endl;
cout << hex << cipher[1] << endl;
cout << hex << cipher[2] << endl;
cout << hex << cipher[3] << endl << endl;
creatAffineTable_jiemi(mainKey);
wbSM4En(cipher, plainText);
cout << hex << plainText[0] << endl;
cout << hex << plainText[1] << endl;
cout << hex << plainText[2] << endl;
cout << hex << plainText[3] << endl << endl;`

@ohhoo
Copy link
Owner

ohhoo commented Mar 14, 2020

我做了测试,首先,加密结果与标准的不同,其次,我将轮密钥反过来生成解密查找表,得到的结果也不对。
这是我的test.cpp

unsigned int mainKey[4] =
{ 0x01234567,0x89abcdef,
0xfedcba98,0x76543210 };
unsigned int plainText[4] =
{ 0x01234567,0x89abcdef,
0xfedcba98,0x76543210 };
unsigned int cipher[4] =
{ 0,0,
0,0 };
creatAffineTable(mainKey);
wbSM4En(plainText, cipher);
cout << hex << cipher[0] << endl;
cout << hex << cipher[1] << endl;
cout << hex << cipher[2] << endl;
cout << hex << cipher[3] << endl << endl;
creatAffineTable_jiemi(mainKey);
wbSM4En(cipher, plainText);
cout << hex << plainText[0] << endl;
cout << hex << plainText[1] << endl;
cout << hex << plainText[2] << endl;
cout << hex << plainText[3] << endl << endl;`

我测试的结果是,重新创建查找表之后的输出结果都会不同,在原论文中提到了会在下一轮对上一轮的输出编码进行解码时引入一个(解码矩阵乘以输出编码(仿射)的常数部分),但是没有提到在何处消去这个冗余,并且在之后的安全性分析中,似乎是由于这个冗余的存在,使得该算法能够抵抗BGE分析。如果你感兴趣的话,可以按照潘文伦论文中的方法实现这个算法,看最终结果是否跟我现在的结果情况相同。

@zdpdz
Copy link
Author

zdpdz commented Mar 14, 2020

我将你代码中的函数都测试了一遍,除了跟矩阵相关的都没问题,有关矩阵的函数的话因为不知道结果是什么,所以无法测试正确性。你现在还在跟进你的这个实现吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants