由于项目的需要,在网上扒了半天,没有找到域GF(2^n)的C语言实现的系统的介绍。本文试图解释偶特征有限域的实现,让读者不必像我一样浪费太多时间在搜索中。本文以GF(2^8)为例。转载请注明出处,谢谢!

甲、有限域的加法实现

简单的异或运算即可:

unsigned char add(unsigned

char a, unsigned char b) {

return a ^ b;

}

乙、有限域的减法实现

与加法相同

unsigned char sub(unsigned char a, unsigned

char b) {

return a ^ b;

}

丙、有限域的乘法实现

算法简介

输入:8-bit数a,b,

输出:8-bit数c

1、 设定c的初始值为0

2、 执行以下循环8次

(1) 如果b的最低位是1,则c与a做异或运算。

(2) 检查a的最高位是否为1.

(3) a左移一位,即舍弃最高位,最低位以0补充。

(4) 如果在上一步左移前,a的最高位是1,则a与十六进制数0x1b做异或运算。

(5) b右移1位,即舍弃最低位,最高位以0补充。

3、c

就是a和b的乘积。

乘法伪代码:

unsigned char mul(unsigned char a, unsigned char b) {

unsigned char p = 0;

unsigned char counter;

unsigned char hi_bit_set;

for(counter = 0; counter < 8; counter++) {

if((b & 1) == 1)

p ^= a;

hi_bit_set = (a & 0x80);

a <<= 1;

if(hi_bit_set == 0x80)

a ^= 0x1b;

b >>= 1;

}

return p;

}

例子 假设 .

1. c

= 0; a = 7(0000 0111); b=3(0000 0011).

2. 进入8次循环

第一次循环

(1) b

的最低位为1 , 故c=0^a=7.

(2) a的值原来是7,

左移一位后a的值为14(0000 1110).

(3) 在a左移一位前,a=7(0000

0111), 显然它的最高位不是1,因此不需要与十六进制数0x1b做异或运算。

(4) b

右移一位,得b=1(00000001).

第二次循环

(1) b

的最低位为1 , 故c=c^a=7^14=9.

(2) 左移一位后a的值为28(000

11100).

(3) 在a左移一位前,a=14(0000

1110), 显然它的最高位不是1,因此不需要与十六进制数0x1b做异或运算。

(4) b

右移一位,得b=1(00000000).

在第三到第八次循环中,b=0,最低位为0,c的值不再改变。

3.

最后c=9,返回c=9;

丁、有限域乘法的快速实现

1、指数表和对数表

有限域的非零元素构成一个Abel群,从而每个非零元素都可以用群的某个生成元素表示。GF(2^8)的生成元素有:

3 5

6 9 11 14 17 18 19 20 23 24 25 26 28 30 3133 34 35 39 40 42 44 48

49 60 62 63 65 69 70 71 72 73 75 76 78 79 82 84 86 8788 89 90 91 95

100 101 104 105 109 110 112 113 118 119 121 122 123 126 129 132134

135 136 138 142 143 144 147 149 150 152 153 155 157 160 164 165 166

167 169170 172 173 178 180 183 184 185 186 190 191 192 193 196 200

201 206 207 208 214215 218 220 221 222 226 227 229 230 231 233 234

235 238 240 241 244 245 246 248251 253 254 255

这些数的16进制表示:

03 05 06 09 0b 0e 11 12 13 14 17 18 19 1a 1c 1e

1f 21 22 23 27 28 2a 2c 30 31 3c 3e 3f 41 45 46

47 48 49 4b 4c 4e 4f 52 54 56 57 58 59 5a 5b 5f

64 65 68 69 6d 6e 70 71 76 77 79 7a 7b 7e 81 84

86 87 88 8a 8e 8f 90 93 95 96 98 99 9b 9d a0 a4

a5 a6 a7 a9 aa ac ad b2 b4 b7 b8 b9 ba be bf c0

c1 c4 c8 c9 ce cf d0 d6 d7 da dc dd de e2 e3 e5

e6 e7 e9 ea eb ee f0 f1 f4 f5 f6 f8 fb fd fe ff

2、利用指数表和对数表进行快速乘法

本方法需要事先存储指数表和对数表,因此需要512Byte的内存。对AES来说,此方法对加密速度影响不大(最多只用3数乘法),但解密时(15数连乘),此方法可加快解密速度。

注意到,有限域GF(2^8)有256个数,但是,对数表只有255个数,这是因为0是一个比较特殊的数,任何数乘以0 都等于0.

unsigned

char  Logtable[256]

=

{ 0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223,

3,

100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28,

193,

125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201,

9, 120,

101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218,

142,

150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70,

131, 56,

102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136,

145, 16,

126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61,

186,

43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115,

167, 87,

175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230,

173, 232,

44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169,

81, 160,

127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118,

123, 183,

204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41,

157,

151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63,

91, 209,

83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211,

171,

68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153,

227, 165,

103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247,

112, 7};

unsigned char Alogtable[256]

=

{ 1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19,

53,

95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102,

170,

229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171,

230, 49,

83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178,

205,

76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120,

136,

131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73,

219, 118, 154,

181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97,

163,

254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32,

96, 160,

251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63,

65,

195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191,

218, 117,

159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122,

142, 137, 128,

155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67,

197, 84,

252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70,

202,

69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81,

243, 14,

18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242,

13, 23,

57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82,

246, 1};

快速乘法:

unsigned

char  mul(unsigned char

a,unsignedchar

b) {

if (a && b)

return Alogtable[(Logtable[a] + Logtable[b])%5];

else return 0;

}

戊、

有限域除法实现

unsigned char  div(unsigned char

a,unsigned char b) {

int j;

if (b == 0) {

printf( "Division by zero\n" );

abort();

}

if (a == 0) return (0);

if ((j = Logtable[a] - Logtable[b]) < 0) j += 255;

return (Alogtable[j]);

}

己、逆元

unsigned char inv(unsigned

char in) {

if(in == 0) return 0;

else

return Alogtable[(255 -

Logtable[in])];

}

gf(2 4)有限域的乘法c语言实现,有限域GF(2^n)的C语言实现浅析相关推荐

  1. c语言实现有限域模多项式_有限域计算简述

    本文为理解FEC(Reed-Solomon)编码的补充,简述用到的有限域计算的知识 有限域定义 这里的域(Field)的定义是有如下特性的集合: 定义了加法和乘法 集合内的元素经过加法和乘法计算,结果 ...

  2. linux c语言乘法口诀,shell 脚本实现乘法口诀表的两种方法——shell与C语言

    shell 脚本实现乘法口诀表的两种方法--shell与C语言 话不多说直接给出代码(执行c语言时没有gcc编译器会报错的哦!): 1 #!/bin/bash 2 if [ $# -eq 0 ] 3 ...

  3. python语言的类型是_Python到底是强类型语言,还是弱类型语言?

    0.前言 我在上一篇文章中分析了 的话题,在文章发布后,有读者跟我讨论起了另一个关于类型的问题,但是,我们很快就出现了重大分歧. 我们主要的分歧就在于:Python 到底是不是强类型语言?我认为是,而 ...

  4. 《零基础看得懂的C语言入门教程 》——(五)C语言的变量、常量及运算

    一.学习目标 了解C语言变量的其它创建方式 了解C语言常量 了解C语言的运算符 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一篇:(一)脱离学习误区 第二篇:(二)C语言没那 ...

  5. c语言tab什么意思_我的C语言入门笔记。

    点击上方"我要学编程",选择"置顶/星标公众号"福利干货,第一时间送达! C语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全 ...

  6. c语言tab什么意思_我的C语言入门笔记~!

    C语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  7. 程序设计基础c语言版大作业,程序设计基础(C语言版)

    本书详细介绍了C语言程序设计所涉及的标记.类型.运算符.表达式.基本输入/输出.顺序结构.选择结构.循环结构.数组类型.指针类型.函数.变量的属性.编译预处理.结构体类型.共同体类型.枚举类型以及文件 ...

  8. R语言入门第二集 实验一:R 语言数据结构、数据导入与数据处理

    R语言入门第二集 实验一:R 语言数据结构.数据导入与数据处理 一.资源 R语言基本数据结构练习和数据的导入和处理对象常用函数练习--东北大学大数据班R语言实训第一次作业" R(4)求解数据 ...

  9. C语言牛牛手里有一个字符串A,程序设计语言C实验卡学生.doc

    程序设计语言C实验卡学生.doc 计算机课程实验卡 课程名称 程序设计语言(C) 班级 顺序号 1(3月4日) 实验名称 实验一 熟悉C语言上机环境 实验目的 1.熟悉C语言的编辑.编译及运行程序的环 ...

  10. php国际化多语言,php 通过include方式实现国际化多语言(i18n)

    php 通过include方式实现国际化多语言(i18n) include实现国际化 将index.php进行翻译: Index内容 1.         Index 2.         About ...

最新文章

  1. 线程安全之strtok()函数
  2. tensorflow object detection API 使用记录2
  3. 如何在Windows下编译OpenSSL?
  4. Eclipse 3.7 安装Maven插件时报错:requires 'bundle org.slf4j.api 1.6.2' but it could not be found...
  5. Wannafly挑战赛18C 异或和
  6. PDB调试Python程序
  7. Twitter Storm安装配置(Ubuntu系统)单机版
  8. 从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第十讲 WPF 系统MainWindow
  9. jquery之统计数字parseFloat
  10. 【Scratch案例实操】scratch我们爱编程 scratch编程案例教学 scratch创意编程 少儿编程教案
  11. 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结【依赖库源码包】
  12. C#读取CAD文件DXF
  13. python金额数字转大写完整代码
  14. 洪水攻击程序c语言,洪水攻击原理及代码实现全攻略(附源代码)病毒防范 -电脑资料...
  15. 邮件html签名手机电脑不一致,HTML电子邮件签名不能在iPhone上正确渲染
  16. 从IT思维到AI思维系列:2.人工智能概念和应用场景
  17. 不谋全局者 , 不足以谋一域 : 不谋万世者 , 不足以谋一时
  18. 全球化经营必备,盘点主流跨境电商平台
  19. 杨紫富豪男友曝光 张一山结婚系剧照乌龙
  20. 微信小程序相册-笔记1

热门文章

  1. jlink6.80a烧写序列号(serial number)问题记录
  2. 玄学编程入坑指南之侠客行:黑匣子·谜
  3. 手机怎么将图片转换成word文档
  4. kindle字体设置
  5. 分享个最终幻想勇气启示录脚本,手游上能一键推图自动升级
  6. FOC电机控制之SVPWM原理与实现
  7. LitePal操作数据库
  8. PSO 粒子群优化算法
  9. Windows虚拟机忘记操作系统密码
  10. 参考文献:《基于非合作博弈的风-光-氢微网容量优化配置》 原文程序,多分布式电源参与的混合微电网容量优化配置是微电网设计的一个重要环节