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

摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(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) = (ab) 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?) 编码实现过程,敬请期待!
感兴趣交流可以留言或关注我的公众号。

原文地址:https://www.cnblogs.com/lijinfeng042/p/9653088.html

时间: 2024-10-13 17:13:32

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

PHP生成二维码二种方法和实例

PHP生成二维码的两个方法和实例,分别使用Google API和PHP二维码生成类库PHP QR Code实现. 之前介绍过通过使用jQuery插件来生成二维码,今天分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: $urlToEncode="http://www.jbxue.com"; generateQRfromGoogle($urlToEnc

发票二维码扫描增强_02_算法概述

技术选型 为了解决二维码无法扫描的问题,必须选择合适的技术手段.由于我们的App引用的是别人开发的基于Zbar的图像识别插件,在没有能力修改图像识别插件的前提下,我决定在服务端解决这个问题,考虑到算法的通用型,在服务端验证通过的程序后期也可以考虑移植到App端,提高本地扫描速度,降低服务器性能消耗.IOS和Android的插件都存在相机对焦完成的事件,在该事件中可以拿到图像信息,我计划在拿到对焦完成的图片后,进行简单压缩后传输至服务器进行解析处理,再将服务器返回的解析结果作为解码结果传递给前台应

ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(goole)生的,QRCode就不用说了吧,虽说技术无国界,但是国人还是有点.... 好,言归正传,java用ZXi

ZXing解析二维码

上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImageLuminanceSource类,该类可在google的测试包中找到,另外j2se中也有该类,你可以将该类直接拷贝到源码中使用,你也可以自己写个. import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.

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

利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面) 一.二维码的介绍 1.什么是二维码? 二维条码/二维码是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的 总结: 用图形记录标记一些信息,方便通过图形识别来获取信息 2 应用场景 信息获取(名片.地图.WIFI密码.资料) 手机电商(用户扫码.手机直接购物下单) 手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付) 微信添加好友 二.二维码界

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

场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(gool

(转)ZXing解析二维码

1 ZXing解析二维码 上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImageLuminanceSource类,该类可在google的测试包中找到,另外j2se中也有该类,你可以将该类直接拷贝到源码中使用,你也可以自己写个. 1.1 BufferedImageLuminanceSource类 package t1; import java.awt.Graphics2D; i

“生成能够被扫描枪正常扫描出中文的二维码”

摆在我眼前的是一个急需解决的问题,那就是生成能够被扫描枪正常扫描出中文的二维码. 这事情领导已经交代清楚,这是新客户的需求,公司仓储部能不能接下这个新项目,这一步很关键,尽管前一天我接到这个任务时还感觉它根本不是个问题,但直到现在,这个问题依旧摆在我面前,它真的花费了我一些时间,而我尚未解决它. 二维码 二维码其实是个相对于条形码的概念,条形码是一维的,那二维码自然就是二维的了,虽然二维码有很多种,但我们平常说的二维码99%(甚至无限接近100%)指的就是QR码这种格式的二维码,QR码是一个日本

聊一聊二维码扫描登录原理

扫二维码登录现在比较常见,比如微信.支付宝等 PC 端登录,并且好像每款 APP 都支持扫码登录,不搞个扫码登录都不好意思.作为技术人员,不知道您对这背后的实现逻辑是否敢兴趣,反正我是一直都对这背后实现好奇.最近刚好看到一个关于扫码登录原理的视频,于是就整理出来了这篇文章,希望对您有所帮助. 本文共三个主题: 什么是二维码. 移动端基于 token 的认证机制. 二维码扫码登录的原理. 1.什么是二维码 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一