伽罗华域(Galois Field)简介

在数学中,有限域(或称伽罗华域)是一个包含有限元素的域。与其他域一样,有限域是进行加减乘除运算都有定义并且满足特定规则的集合。其中加法和乘法必须满足交换、结合和分配的规律。加法和乘法具有封闭性,即加法和乘法结果仍然是域中的元素。

伽罗华域一般用G F ( 2 M ) GF(2^M)GF(2M)表示,这个域中含有2 M 2^M2M个元素。G F ( 2 M ) GF(2^M)GF(2M)上的四则运算是基于多项式运算的,上过学的应该都知道什么是多项式,一般都是这种结构f ( x ) = x 6 + x 4 + x 2 + x + 1 f(x) = x^6 + x^ 4 + x^2 + x + 1f(x)=x6+x4+x2+x+1 。

本原多项式 (primitive polynomial)是一种特殊的不可约多项式。当一个域上的本原多项式确定了,这个域上的运算也就确定了。本原多项式一般通过查表得知,同一个域往往有多个本原多项式。

G F ( 2 M ) GF(2^M)GF(2M)域,当M=8时,其中比较常见的一个本原多项式为P ( x ) = x 8 + x 4 + x 3 + x 2 + 1 P(x)=x^8+x^4+x^3+x^2+1P(x)=x8+x4+x3+x2+1。G F ( 2 8 ) GF(2^8)GF(28)域也是计算机领域用的比较多的一种域,因为一字节等于8比特嘛。研究这个玩意也是因为AES加密中列混合变换中用到了伽罗华域运算,但是 AES加解密算法中,使用的不可约多项式(irreducible

polynomial)为P ( x ) = x 8 + x 4 + x 3 + x + 1 P(x)=x^8+x^4+x^3+x+1P(x)=x8+x4+x3+x+1,所以下面主要讨论AES算法中用到的G F ( 2 8 ) GF(2^8)GF(28)域,多项式为P ( x ) = x 8 + x 4 + x 3 + x + 1 P(x)=x^8+x^4+x^3+x+1P(x)=x8+x4+x3+x+1乘法的实现。

运算规则

加法

在伽罗华域中,加法是模2运算,也就是忽略进位的加法,等同于计算机中的XOR异或,即 1^1=0, 1^0=1, 0^0=0。

乘法

伽罗华域中的乘法是基于多项式运算的,比如:5 = 00000101 b = ( 2 2 + 1 ) 5=00000101b=(2^2+1)5=00000101b=(22+1),对应多项式为 ( x 2 + 1 ) (x^2+1)(x2+1)。

举例:

3 ∗ 7 = ( x + 1 ) ( x 2 + x + 1 ) = x 3 + x 2 + x + x 2 + x + 1 = x 3 + ( x 2 + x 2 ) + ( x + x ) + 1 = x 3 + 1 3*7=(x+1)(x^2+x+1)=x^3+x^2+x+x^2+x+1=x^3+(x^2+x^2)+(x+x)+1=x^3+13∗7=(x+1)(x2+x+1)=x3+x2+x+x2+x+1=x3+(x2+x2)+(x+x)+1=x3+1

(模2加法中相同项相加为0)。

在相乘得到的多项式结果中,如果x的次数大于7,就需要对多项式在GF(2)上关于本原多项式P(x)求余数,即m o d P ( x ) mod P(x)modP(x)。

因为加法为模2加法,相同项相加为0,所以减法可以当成加法来计算。

基于多项式P ( x ) = x 8 + x 4 + x 3 + x 2 + 1 P(x)=x^8+x^4+x^3+x^2+1P(x)=x8+x4+x3+x2+1:

129 ∗ 5 = ( x 7 + 1 ) ∗ ( x 2 + 1 ) = ( x 9 + x 7 + x 2 + 1 ) 129*5=(x^7+1)*(x^2+1)=(x^9+x^7+x^2+1)129∗5=(x7+1)∗(x2+1)=(x9+x7+x2+1)

= ( x 9 + x 7 + x 2 + 1 ) + ( x ∗ P ( x ) ) = ( x 9 + x 7 + x 2 + 1 ) + ( x 9 + x 5 + x 4 + x 3 + x ) =(x^9+x^7+x^2+1)+(x*P(x))=(x^9+x^7+x^2+1)+(x^9+x^5+x^4+x^3+x)=(x9+x7+x2+1)+(x∗P(x))=(x9+x7+x2+1)+(x9+x5+x4+x3+x)

= x 7 + x 5 + x 4 + x 3 + x 2 + x + 1 = 10111111 b = 0xBF = 191 =x^7+x^5+x^4+x^3+x^2+x+1=10111111\text b=\text {0xBF}=191=x7+x5+x4+x3+x2+x+1=10111111b=0xBF=191

基于多项式P ( x ) = x 8 + x 4 + x 3 + x + 1 P(x)=x^8+x^4+x^3+x+1P(x)=x8+x4+x3+x+1:

129 ∗ 5 = ( x 7 + 1 ) ∗ ( x 2 + 1 ) = ( x 9 + x 7 + x 2 + 1 ) 129*5=(x^7+1)*(x^2+1)=(x^9+x^7+x^2+1)129∗5=(x7+1)∗(x2+1)=(x9+x7+x2+1)

= ( x 9 + x 7 + x 2 + 1 ) + ( x ∗ P ( x ) ) = ( x 9 + x 7 + x 2 + 1 ) + ( x 9 + x 5 + x 4 + x 2 + x ) =(x^9+x^7+x^2+1)+(x*P(x))=(x^9+x^7+x^2+1)+(x^9+x^5+x^4+x^2+x)=(x9+x7+x2+1)+(x∗P(x))=(x9+x7+x2+1)+(x9+x5+x4+x2+x)

= x 7 + x 5 + x 4 + x + 1 = 10110011 b = 0xB3 = 179 =x^7+x^5+x^4+x+1=10110011\text b=\text {0xB3}=179=x7+x5+x4+x+1=10110011b=0xB3=179

代码实现

推导

因为在AES算法列混合环节中用到了伽罗华域乘法,所以接下来的代码实现使用AES算法指定的不可约多项式P ( x ) = x 8 + x 4 + x 3 + x + 1 P(x)=x^8+x^4+x^3+x+1P(x)=x8+x4+x3+x+1进行分析。

GMul(2, v)

为了方便编程我们先找找规律,假设函数GMul(u, v)表示伽罗华域乘法,先看与2相乘的伽罗华域计算,即GMul(2, v),v、u不分左右:

2 ∗ 7 = ( x ) ∗ ( x 2 + x + 1 ) = x 3 + x 2 + x 2*7=(x)*(x^2+x+1)=x^3+x^2+x2∗7=(x)∗(x2+x+1)=x3+x2+x(可以看出伽罗华域中一个数与2相乘等于这个数左移一位)

看上式,假如v对应的多项式x的次数大于7,即v的最高位为1,也就是v>>7 == 1的话就进行 m o d P ( x ) mod P(x)modP(x) 化简,比如:

2 ∗ 129 = x ∗ ( x 7 + 1 ) = x 8 + x = ( x 8 + x ) + P ( x ) 2*129=x*(x^7+1)=x^8+x=(x^8+x)+P(x)2∗129=x∗(x7+1)=x8+x=(x8+x)+P(x)

= ( x 8 + x ) + ( x 8 + x 4 + x 3 + x + 1 ) = x 4 + x 3 + 1 =(x^8+x)+(x^8+x^4+x^3+x+1)=x^4+x^3+1=(x8+x)+(x8+x4+x3+x+1)=x4+x3+1

= 00011001 = 0x19 = 00000010 ∧ 00011011 = 0x02 ∧ 0x1B = ( 129 < < 1 ) ∧ 0x1B = 00011001 = \text {0x19} = 00000010 \land 00011011 = \text {0x02} \land \text {0x1B}=(129<<1) \land \text{0x1B}=00011001=0x19=00000010∧00011011=0x02∧0x1B=(129<<1)∧0x1B

2 ∗ 176 = x ∗ ( x 7 + x 5 + x 4 ) = x 8 + x 6 + x 5 = ( x 8 + x 6 + x 5 ) + P ( x ) 2*176=x*(x^7+x^5+x^4)=x^8+x^6+x^5=(x^8+x^6+x^5)+P(x)2∗176=x∗(x7+x5+x4)=x8+x6+x5=(x8+x6+x5)+P(x)

= ( x 8 + x 6 + x 5 ) + ( x 8 + x 4 + x 3 + x + 1 ) = x 6 + x 5 + x 4 + x 3 + x + 1 =(x^8+x^6+x^5)+(x^8+x^4+x^3+x+1)=x^6+x^5+x^4+x^3+x+1=(x8+x6+x5)+(x8+x4+x3+x+1)=x6+x5+x4+x3+x+1

= 01111011 = 0x7B = 0110 , 0000 ∧ 0001 , 1011 = 0x60 ∧ 0x1B = ( 176 < < 1 ) ∧ 0x1B = 0111 1011 = \text {0x7B} = 0110,0000 \land 0001,1011 = \text {0x60} \land \text {0x1B}=(176<<1) \land \text{0x1B}=01111011=0x7B=0110,0000∧0001,1011=0x60∧0x1B=(176<<1)∧0x1B

从上面的3个例子可以总结一个规律:

G M u l ( 2 , v ) = { v < < 1 , if  ( v > > 7 )  is 0x00 . ( v < < 1 ) ∧ 0x1B , if  ( v > > 7 )  is 0x01 . GMul(2, v)= \begin{cases} v<<1, & \text {if $(v >> 7)$ is 0x00}. \\ (v<<1) \land \text {0x1B}, & \text {if $(v>>7)$ is 0x01}. \end{cases}GMul(2,v)={v<<1,(v<<1)∧0x1B,​if(v>>7)is 0x00.if(v>>7)is 0x01.​

GMul(3, v)

3 ∗ v = ( 2 + 1 ) ∗ v = G M u l ( 2 , v ) + v 3*v=(2+1)*v=GMul(2, v) + v3∗v=(2+1)∗v=GMul(2,v)+v= GMul(2, v) ^ v

GMul(4, v)

4 ∗ v = 2 ∗ 2 ∗ v 4*v=2*2*v4∗v=2∗2∗v= GMul(2, GMul(2, v))

GMul(7, v)

7 ∗ v = 00000111 = ( 2 ∗ 2 + 2 + 1 ) 7*v= 00000111 =(2*2 + 2 + 1)7∗v=00000111=(2∗2+2+1)= GMul(2, GMul(2, v)) ^ GMul(2, v) ^ v

GMul(8, v)

8 ∗ v = ( 2 ∗ 2 ∗ 2 ) ∗ v 8*v=(2*2*2)*v8∗v=(2∗2∗2)∗v=GMul(2, GMul(2, GMul(2, v)))

8=2^3,循环3次GMul(2,v)

GMul(11111111b, v)

11111111 b = 2 7 + 2 6 + 2 5 + 2 4 + 2 3 + 2 2 + 2 + 1 11111111b = 2^7+2^6+2^5+2^4+2^3+2^2+2+111111111b=27+26+25+24+23+22+2+1

所以相当于:GMul(2,v)循环7次 ^ GMul(2,v)循环6次 … GMul(2,v)循环1次 ^ v

代码实现

GMul(2, v)

根据上面总结的公式可以很容易用代码实现GMul(2, v)

uint8_t GMul2(uint8_t v){

int flag = (v & 0x80);

v <<= 1;

if (flag) {

v ^= 0x1B; /* P(x) = x^8 + x^4 + x^3 + x + 1 */

}

return v;

}

GMul(u, v)

根据上述对GMul(u, v)的总结,可以用一下代码实现:

uint8_t GMul(uint8_t u, uint8_t v) {

uint8_t p = 0;

for (int i = 0; i < 8; ++i) {

if (u & 0x01) {

p ^= v;

}

v = GMul2(v); //调用GMul(2,v)

u >>= 1;

}

return p;

}

为了代码整洁可以写成一个通用的函数,AES算法实现中列混合环节可以直接调用下面的函数:

uint8_t GMul(uint8_t u, uint8_t v) {

uint8_t p = 0;

for (int i = 0; i < 8; ++i) {

if (u & 0x01) {

p ^= v;

}

int flag = (v & 0x80);

v <<= 1;

if (flag) {

v ^= 0x1B; /* P(x) = x^8 + x^4 + x^3 + x + 1 */

}

u >>= 1;

}

return p;

}

参考

CSDN博客 伽罗华域(Galois Field)上的四则运算

AES算法标准 Federal Information Processing Standards Publication 197 ADVANCED ENCRYPTION STANDARD (AES)

代码参考 Libtom AES code

c语言实现伽罗华域乘法器,伽罗华域运算及C语言实现相关推荐

  1. c语言实现伽罗华域乘法器,[2018年最新整理]伽罗瓦域GF(2^128)乘法器的设计.doc

    [2018年最新整理]伽罗瓦域GF(2^128)乘法器的设计 摘要 本文是在理解伽罗瓦域乘法器工作原理的基础上,设计一个伽罗瓦域乘法器,并通过verilog硬件描述语言,用Modelsim,Synpl ...

  2. 精品软件推荐-罗塞达石碑(Rosetta Stone)V5.037 语言学习Mac中文版

    前言 今年也想把自己英语这块的能力做点提高,于是就去知乎搜索mac上学习英语的软件,就发现这个,罗塞达石碑(Rosetta Stone).安装这个软件的过程有点曲折,废了好大劲才找到破解软件并且导入语 ...

  3. c罗图片带字经典语言,c罗励志语录 c罗经典语录名言

    简介c罗励志语录 c罗经典语录名言 1.记得我以前说过,我是高富帅这样的话,其实那是一个错误.人都犯反错误,但重要的是,你一定要认识自己的错误,要勇于改正,我说那话的时候是在一场比赛之后,那场比赛我没 ...

  4. python语言最早的可用版本诞生于几几年_python语言公开发行版本诞生于哪年

    python语言公开发行版本诞生于1991年,Python是一种计算机程序设计语言,由[吉多・范罗苏姆]创造,Python的设计哲学强调代码的可读性和简洁的语法,相比于[C++]或Java,Pytho ...

  5. 专访罗升阳:老罗的Android之旅(转载)

    本文转载地址:专访罗升阳:老罗的Android之旅 [编者按]我们常说的智能手机实际上就是手机上加了一个操作系统,那么大部分人都会跟我一样不禁发问,这个操作系统和我们接触更多的电脑上的操作系统一样吗. ...

  6. 专访罗升阳:老罗的Android之旅

    CSDN首页 > 业界 专访罗升阳:老罗的Android之旅 发表于2014-08-15 14:13| 10091次阅读| 来源CSDN| 0 条评论| 作者钱曙光 社区问答访谈罗升阳Andro ...

  7. 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介

    非常有幸在<极客时间>上看到<Go语言从入门到实战>这门课程,本课程的作者给出了较为详细的学习路线图,具体如下: 学习路线图  学习目的 个人学习的目的主要是了解Go语言的基本 ...

  8. 在C语言里_大学生:我学了这么久的C语言,为什么感觉它啥都做不了?网友:恰恰相反!...

    很多人学习C语言的时候会发现,为什么我学了这么久但是感觉啥都做不了呢? 这是很多初学者都会疑惑过的事情,但是你要C语言几乎是所有语言的实现基础,所以不存在做不了的事情,只是相对来说谁做更合适,编写游戏 ...

  9. c语言中描述x和y都大于或等于z的表达式,C语言期末考试题含答案.doc

    C语言期末考试题含答案 <C语言程序设计>期末试卷 一.单项选择题(10x2'=20') 1.以下叙述正确的是( ) A)C语言的源程序不必通过编译就可以直接运行. B)C语言中的每条可执 ...

最新文章

  1. 一觉醒来2T硬盘数据化为乌有,背后或是两名黑客在竞争式入侵
  2. springMVC项目国际化(i18n)实现方法
  3. fragments lifecycle
  4. 《SQL Server 2008从入门到精通》--20180716
  5. wps for linux alpha 15 语言包,WPS Office for Linux Alpah 7发布
  6. winform自定义分页控件
  7. linux raid5卷,Linux逻辑卷及RAID5的创建
  8. ORA-12514: TNS:listener does not currently know of service …
  9. ubuntu文件系统知识
  10. MT6573驱动开发日志之touchpanel
  11. Verdi快速使用技巧
  12. 基于单片机的通用定时器调度器SmartTimer
  13. 用C语言编程取出八个球,带你解决C语言编程问题~之口袋放球取法
  14. 贵州华芯通半导体驻北京研发中心开业
  15. RabbitMQ 之集群模式
  16. container_of 和 offsetof 解析
  17. Ubuntu18.04添加自启动脚本
  18. 股票代码中OF与SZ的区别
  19. 微信营销七(微信朋友圈发文技巧)
  20. python nltk语义分析_Python nltk 如何解析出英语短语?

热门文章

  1. RT-Thread记录(八、理解 RT-Thread 内存管理)
  2. 13安卓版 ilauncher_iLauncher iphone 11 max pro ios 13 Theme Wallpaper 下载
  3. Python缩进规则(包含快捷键)
  4. 语句覆盖率\条件覆盖率\路径覆盖率\分支覆盖率的区别您知道吗
  5. redis原理之快照(rdb)原理
  6. Bulk Insert:将文本数据(csv和txt)导入到数据库中
  7. poj3122 OpenJudge008 Pie派(二分查找)
  8. 使用 face++ API 实现人脸识别,刷脸登陆和活体检测(张张嘴,眨眨眼)
  9. 信息熵、条件熵——学习笔记
  10. jquery html对象 转换成字符串,JQuery - 将'HTMLDivElement'对象数组转换为字符串