摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过。同时数论基础也是 Hash 算法,RSA 算法等密码学的入门基础。

二维码生成算法最为核心的就是编码规则和纠错码字的生成。本篇专门讲解纠错涉及到的伽罗瓦域(Galois Field)。本文内容大部分是阅读《密码编码学与网络安全》后参考相关 PPT 编写,如有遗漏或不严谨地方请参考专业书籍。


数论基础

整除,因数,素数

设 a , b(b≠0) 是两个整数,如果存在另外一个整数 c 使得 a=b·c , 则称 b 整除 a, 记为 b|a, 且称 b 为 a 的因子。如果 p (p>1) 的因子只有 ±1,±p,称整数 p 是素数。

如果 a 和 n(n≠0) 是两个整数,则定义 a mod n 是 a 除以 n 所得的余数。正整数 n 称为模数。因此对于任意整数 a 可以写出:

a = qn + r (0<=r<n);q= ⌊a/n⌋

a = ⌊a/n⌋ * n + ( a mod n)

例子: a = 49,n = 8, 则 q = 49 mod 8 = floor(49/8) = 6 , r = 49 mod 8 = 1
,49 = 6 * 8 + 1 .

最大公因数

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有因子中最大的一个。记为 gcd(a,b)。如果 gcd(a,b) = 1 , 则说 a,b 互素,记为 a⊥b。

Euclid 定理:对任意非负整数 a 和正整数 b,有 gcd(a, b)=gcd(b, a-b)=gcd(b, a mod b)=gcd(a, b mod a), 这也是常见的辗转相除法的理论基础。

示例:

gcd(18,12)
= gcd(12,18-12) = gcd(12,6) = gcd(6,0) = 6

= gcd(12,18 mod 12) = gcd(12,6) = gcd(6,0) = 6

同余

如果 (a mod n)=(b mod n),则称两整数 a 和 b 模 n 同余,记为 a ≡ b mod n。模 n 的剩余类集合定义比 n 小的非负整数集合 Z(n)={0,1,2...,(n-1)},更准确来说集合中每一个整数都代表一个剩余类。我们将模 n 的剩余类表示为 [0],[1],...[n-1], 其中 [r] = {a:a 是一个整数,a ≡ n mod r}.

mod 在此处的含义表示 a 和 b 对于给定的模数有等价关系,和说(a- b)是 n 的整数倍一样。

例子:49 mod 8 = 17 mod 8 = 1 , 则 49 ≡ 17 mod 8, 等价于 8 | (49 - 17 ) = 8 | 32 显然是成立的。

模运算

模运算的结果都限制在模的剩余类里面,运算封闭这是非常重要的一个性质。

  • 交换律

    • (w+x) mod n=(x+w) mod n
    • (w×x) mod n=(x×w) mod n
  • 结合律
    • [(w+x)+y] mod n=[w+(x+y)] mod n
    • [(w×x)×y] mod n=[w×(x×y)] mod n
  • 分配律
    • [w×(x+y)] mod n=[w×x+w×y] mod n
  • 单位元
    • (0+w) mod n=w mod n
    • (1×w) mod n=w mod n
  • 加法逆元
    • 对 w∈Zn 存在 z∈Zn,使得 w+z≡0 mod n,记 z=-w。
  • 加法可约律
    • 如果 (a+b) ≡ (a+c) mod n,则 b≡c mod n
  • 乘法可约律
    • 如果 (a×b) ≡ (a×c) mod n 且 a 有乘法逆元,那么对 (a×b) ≡ (a×c) mod n 两边同乘以 -a,即得 b ≡ c mod n

下面的示例是计算 Z(4)={0,1,2,3}的模加法和模乘法

加法模运算

(a mod 4) + (b mod 4) = (a+b) mod 4
+|0 | 1 | 2 | 3
---|---|---|---|---
0|0 | 1 | 2 | 3
1|1 | 2 | 3 | 0
2|2 | 3 | 0 | 1
3|3 | 0 | 1 | 2

加法:对每一 x,都有一 y,使得 x+y ≡ 0 mod 4。如对 3,有 1,使得 3+1 ≡ 0 mod 4,称 y 为 x 的负数,也称为加法逆元。

乘法模运算

(a mod 4) * (b mod 4) = (a*b) mod 4

* 0 1 2 3
0 0 0 0 0
1 0 1 2 3
2 0 2 0 2
3 0 3 2 1

乘法:对 x,若有 y,使得 x*y ≡ 1 mod 4,如 3×3 ≡ 1 mod 4,则称 y 为 x 的倒数,也称为乘法逆元。
并非每一 x 都有乘法逆元

定理:设 a∈Zn,gcd(a, n) = 1,则 a 在 Zn 中有乘法逆元。

上表中只有 a = 1,a = 3 满足 gcd(a,4) = 1, 从高亮结果可以看到定理的正确性。严格证明略。

扩展的欧几里德算法

对于给定的整数 a 和 b ,扩展的欧几里德算法不仅能计算出最大公约数 gcd(a,b),还可以算出另外两个整数 x 和 y 满足方程 a*x + by = d = gcd(a,b)。对于给定的 (a,b) 如何计算 (x,y,d), 过程如下:(截图《自密码编码学与网络安全 原理与实践 第 6 版》 , 斯托林斯著)

算法流程图如下:默认 a > b,否则根据性质可以调整过来

最常用的方法就是使用一个表格计算:
gcd(1759,550)= gcd(550,1759 mod 550) =gcd(550,109) = gcd(109,5) = 1

Q(整数部分) X1 X2 X3 Y1 Y2 Y3
--- 1 0 1759 0 1 550
1759/550=3 0 1 550 1-3*0=1 0-3*1=-3 109
550/109=5 1 -3 109 0-5*1=-5 1-5*(-3)=16 5
109/5=21 -5 16 5 1-21*(-5)=106 -3-21*16=-339 4
5/4=1 106 -339 4 -5-1*106= -111 16-1*(-339)=355 1

直到 Y3 = 1 , 此时 有 d = Y3 = 1,x = Y1 = -111,y = Y2 = 355. 验算如下: 1759 * (-111) + 550 * (355) = -195249 + 195250 = 1 .

域,群,环

具体就不展开了,感兴趣可以参考相关专业书籍,截图一张说明他们满足公理的关系


伽罗瓦域定义

在数学中,有限域(英语:Finite field)或伽罗瓦域(英语:Galois field,为纪念埃瓦里斯特·伽罗瓦命名)是包含有限个元素的域。与其他域一样,有限域是进行加减乘除运算都有定义并且满足特定规则的集合。有限域最常见的例子是当 p 为素数时,整数对 p 取模。有限域的元素个数称为它的序。

这是维基百科的定义,需要请点击查看更多内容

每个有限域的阶必为素数的幂,即有限域的阶可表示为 pⁿ(p 是素数,n 是正整数),记为 GF(pⁿ)。当 n = 1,GF(p) 就是 mod p,因为一个数 模 p 后,结果在 [0, p-1] 之间,有限域包含 p 个元素。


下期将会讨论具体的 GF(pⁿ) 编码实现过程,敬请期待!

感兴趣交流可以留言,共同探讨学习,限于作者水平有限,理解不到位,有错误的地方望不吝赐教,感谢!
你也可以关注公众号:ProgramLife042,公众号名称:风之程序人生。查看更多最新内容。

你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)的更多相关文章

  1. PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)

    PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001  至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...

  2. Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)

    二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...

  3. thinkphp5框架生成二维码(二)

    上篇已经讲过了SDK之类的,这个不再重复,有不知道的童鞋们,请去看上篇文章吧. 这里我用的方法比较老旧,大家有更好的方法,可以进行改良,还有linux服务器,记得给文件权限,否则生成的文件会失败的.大 ...

  4. 把链接生成二维码 二维码中间带有logo

    在工程中引入三个文件jquery.qrcode.js.qrcode.js.utf.js.其中utf.js文件是防止链接中的参数出现中文乱码现象 jquery.qrcode.js文件 function ...

  5. ios-深度解析二维码的生成与使用

    利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面)   一.二维码的介绍   1.什么是二维码?        二维条码/二维码是用某种特定的 ...

  6. (转)ZXing解析二维码

    1 ZXing解析二维码 上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImag ...

  7. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  8. 链接生成二维码-PHP

    原文:http://www.upwqy.com/details/20.html 链接生成二维码 首先下载phpqrcode phpqrcode.zip 我这里使用的是TP5,把下载好的类库 放入到ex ...

  9. Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系

    Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...

随机推荐

  1. Javascript (ECMAScript5) 的细节和违反直觉的地方

    记录在学习Javascript (ECMAScript5) 中的一些与其他语言的不同之处,本文会不断更新. 里面的知识可能并不太适合有一定经验的Javascript程序员,仅仅但不限于给初学者阅读. ...

  2. JWinner:一个私人定制的快速开发框架,为理想而生

    关于JWinner JWinner是一个JAVA项目的快速开发框架,他已经实现了大多数项目开发之前需要进行的一些必备工作,还有很多在开发过程中可能会用到的工具集. JWinner的诞生并不是一蹴而就的 ...

  3. linux centos 7.5下 源码编译安装 lua环境

    lua 5.3.5 下载安装时发现缺少库 readline 需要添加依赖 yum search readline 看有哪些包 安装带有 devel 字样的 安装无 devel 的非开发包,通常不会自动 ...

  4. Day9 抽象类和接口

    抽象类 抽象类定义 只约定类所具有的抽象行为,没有具体实现相应行为. 语法格式 abstract class 类名{ 常量; 变量; 构造(); 访问修饰符abstract 返回类型 方法名;//抽象 ...

  5. kong安装

    1 哪些企业在用KONG: Mashapoe Marketplace Buzzlogix Gengo IBM Intel OpenDNS 饿了么 Kong可与两种不同的组件协同工作: Nginx:Ko ...

  6. 20155314 2016-2017-2 《Java程序设计》第3周学习总结

    20155314 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 学习目标 区分基本类型与类类型 理解对象的生成与引用的关系 掌握String类和数组 理解封 ...

  7. 集合之保持compareTo和equals同步

    在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法.我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于.同时我们也知道e ...

  8. HihoCoder - 1336 二维数状数组(单点更新 区间查询)

    You are given an N × N matrix. At the beginning every element is 0. Write a program supporting 2 ope ...

  9. 流程一直处于Running状态,应该怎么停止?

    流程一直处于Running状态,应该怎么停止? 概述 我们有遇到这种情况:可能由于某些原因,流程发起后一直处于Running状态,然后我们想Stop掉这些出问题的流程,这个时候你在Workspace里 ...

  10. Java中队列

    定义 队的操作是在两端进行,一端只能进行插入操作(入队),称为队尾,一端只能进行删除操作(出队),称为队尾. 队列的运算规则是FIFO(first in first out). 队列的入队.出队操作分 ...