如何在C+中将两个4位数字作为多项式进行乘法+; 我用C++模拟了一个小型AES加密/解密算法。p>

如何在C+中将两个4位数字作为多项式进行乘法+; 我用C++模拟了一个小型AES加密/解密算法。p>,c++,cryptography,aes,modular-arithmetic,galois-field,C++,Cryptography,Aes,Modular Arithmetic,Galois Field,为此,我需要将两个4位数字相乘,同时将它们视为多项式 它经历了一些阶段,将它们转换为多项式,将两个多项式相乘,然后根据需要使用预定义的不可约多项式进行多项式缩减以降低功耗,最后将它们转换回4位格式 例如,乘以1011⊗ 0111类似于x3+x+1⊗ x2+x+1 答案是,如果x5+x4+1的幂为5,则需要通过除以预定义的多项式x4+x+1来减小它。答案将是x2,即0100 非常感谢 例如,您可以这样做 unsigned int multiply\u poly(unsigned int a,uns

为此,我需要将两个4位数字相乘,同时将它们视为多项式

它经历了一些阶段,将它们转换为多项式,将两个多项式相乘,然后根据需要使用预定义的不可约多项式进行多项式缩减以降低功耗,最后将它们转换回4位格式

例如,乘以
1011⊗ 0111类似于x3+x+1⊗ x2+x+1
答案是,如果
x5+x4+1
的幂为
5
,则需要通过除以预定义的多项式
x4+x+1
来减小它。答案将是
x2
,即
0100


非常感谢

例如,您可以这样做

unsigned int multiply\u poly(unsigned int a,unsigned int b)
{
无符号整数ret=0;
while(a)
{
如果(a&1)
{
ret^=b;
}
a>>=1;

b两个4位数字?通常,位操作功能(例如,第一位、最后一位、位计数)速度慢且效率低,除非CPU具有实现这些功能的特殊功能(例如,SSE4具有位计数例程)。常见的有效解决方案是创建一个帮助器数组来解决字节问题(256长数组,每个字节都有解决方案)

在您的情况下,我会将两个4位多项式存储在一个
无符号字符中,并使用
std::array
和预先计算的答案。因此,整个计算被替换为一个加载操作(希望来自L3缓存或您平台上任何最有效的内存)


初始化数组只需计算一次答案。即使计算函数速度慢且效率低,也不会成为问题。

无符号1:4;无符号2:4;
这似乎是一个家庭作业。您编写过代码吗?此答案缺少使用x^4=x+1的缩减。在每个步骤中,请查看位5。如果设置为1 t当清除它和x-或带有0x03的ret时,我有相应的代码,但正如@efekctive指出的,这似乎是一个家庭作业,我不会为OP做全部的家庭作业。