利用生成元求解乘法逆元

利用生成元来计算GF(2^8)域中的乘法逆元

本人第一次写博客,想想还是有点激动哈哈。以前是看别人文章比较多,或者下载一些有用的资源。今天晚上终于理解了困扰我多天的乘法逆元求解问题,本来想在笔记本上记载下思路的,突然想到写个博客,以后查看也方便。


下面开始正文
本人主要是结合了下面链接中的介绍以及别人的代码才理解了利用生成元求逆元。下面贴出链接。
https://wenku.baidu.com/view/2c14b3e6376baf1ffd4fadb2.html

“群”及“生成元”的概念 ###

“群”定义

设G是一个非空集合,“ * ”是G上的一个代数运算,即
对所有的a, b,有 a*b G.
如果G的运算还满足:
1. 结合律:即对所有的a, b, c G,有
    (a*b)* c = a * (b * c)
2. G中存在元素e,使得对每个a G, 有
     e * a = a * e = a
3. 对G中每个元素a, 存在元素b G, 使得
     a * b = b * a = e
则称G关于运算“ * ”构成一个群(group),记为G.
上文中的元素e称为群G的单位元,群G的单位元是唯一的。

元素b称为元素a的逆元(inverse),元素a的逆元是唯一的,记为 a1 a − 1 ,a * a1 a − 1 = e

“群”的概念

例1. G = { 1, -1, i, -i},则(G, )是一个有限交换群

元素a 1 -1 i -i
逆元素 a1 a − 1 1 -1 -i i

一般的可分为“加群”和乘群。文章开头给出的链接中举了很多例子,想更清楚的了解“群”的,可以去看看。

生成元

要求GF( 28 2 8 )中乘法的逆,应选择循环乘群模型。
若存在 aG a ∈ G ,使得
G={a1,a2,...,ar} G = { a 1 , a 2 , . . . , a r }
则称G是一个循环乘群,且a是G的一个生成元。生成元不是唯一的。

有了上述知识,我们已经可以利用生成元计算GF( 28 2 8 )中的乘法和逆元了。

  • 乘法
    Mul(x, y)
    x=ai x = a i y=aj y = a j ,则 xy=a(i+j)mod(r) x ∗ y = a ( i + j ) m o d ( r )
  • 逆元
    x=aixy=e x = a i , x ∗ y = e
    y=ari y = a r − i

算法实现的话,可以构造出从0~r-1阶的pow和log两张表,计算乘法时只需要查表即可了。

    for( i = 0, x = 1; i < 256; i++, x ^= XTIME( x ) )
    {
        pow[i] = x;
        log[x] = i;
    }

上面代码中,群的阶数为256,XTIME( x )是利用 ari a r − i 计算 ar a r ,这个运算要考虑具体协议中对于GF( 28 2 8 )域乘法的规定。


第一次写博客,发现自己弄懂了一个知识点要把它再讲清楚让别人也能够理解还是听不容易的。该去洗澡了,明天还要上班。改天有时间再完善一下吧。

你可能感兴趣的:(加密算法)