0

我正在使用 C++ 模拟一个迷你 AES 加密/解密算法。

为此,我需要在将two 4-bit numbers它们视为多项式的同时进行乘法。

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

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

提前谢谢了!

4

2 回答 2

1

例如,您可以这样做

unsigned int multiply_poly(unsigned int a, unsigned int b)
{
    unsigned int ret = 0;
    while(a)
    {
        if(a & 1)
        {
            ret ^= b;
        }
        a >>= 1;
        b <<= 1;
    }
    return ret;
}

解释:你基本上是写乘法。您将a向右移动并始终查看最后一位。如果是0,如果是1你与 b 异或,你什么也不加。由于 xor 不完全是整数加法,因此这不仅仅是a*b. 大家可以想想为什么两个多项式的相加可以通过异或来完成。由于我们b向左移动,它总是乘以来自 的当前单声道a

于 2019-11-30T15:57:28.977 回答
0

两个 4 位数字?通常位操作函数(例如,第一位、最后一位、位计数)是缓慢且低效的,除非 CPU 具有实现它们的特殊功能(例如,SSE4 具有用于位计数的例程)。常见的有效解决方案是创建一个解决字节问题的辅助数组(256 个长数组,每个字节都有解决方案)。

在您的情况下,我会将两个 4 位多项式存储在一个内unsigned char,并std::array<unsigned char,256>与预先计算的答案一起使用。因此,整个计算都被单个加载操作所取代(希望来自 L3 缓存或您的平台拥有的任何最有效的内存)。

您只需计算一次答案即可初始化数组。即使计算功能缓慢且效率低下,也不会成为问题。

于 2019-11-30T18:39:44.340 回答