二维码知识介绍

一、二维码的分类

二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量。

从形成方式上,二维码可以分为两类,

1、堆叠式二维码:在一维条形码的基础上,将多个条形码堆积在一起进行编码,常见的编码标准有PDF417等

                          图1 PDF417码示例

2、矩阵式二维码:在一个矩阵空间中通过黑色和白色的方块进行信息的表示,黑色的方块表示1,白色的方块表示0,相应的组合表示了一系列的信息,常见的编码标准有QR 码,汉信码等

       图2 QR码示例                                  图3 汉信码示例

PDF417由美国研发,在美国地区使用广泛 汉信码由中国自主研发,目前已在政府相关领域得到初步的使用。 QR码由日本研发,目前很多的应用都是用QR码进行编码,译码

目前使用最广的是QR码,所以接下来的内容会对QR码进行讲解,下文中提到的二维码,指的就是QR码

QR码分为40个版本,版本1由21x21个方块组成,每个版本增加4个方块,版本40由177x177个方块组成。每增加一个版本,QR码可储存的信息数量也随之增多。

版本1的二维码最多可以储存25个字符或41个数字,而版本40的二维码最多可以储存4296个字符或7089个数字

二、二维码的结构

一个二维码可以分为两个部分,功能图形和编码区域

                                         图4

功能图形起到定位的作用

位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。

定位图形       :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。

校正图形       :仅在版本2以上存在,由三个黑白相间的小正方形嵌套组成,便于确定中心,纠正扭曲。

数据区记录了具体的数据信息,纠错信息与版本信息。

数据和纠错码:记录了数据信息和相应的纠错码,纠错码的存在使得当二维码的数据出现允许范围内的错误时,也可以正确解码。

版本信息       :仅在版本7以上存在,记录具体的版本信息。

格式信息       :记录使用的掩码和纠错等级。

此外二维码的外围还留有一圈空白区,主要是为了便于识别而存在。

三、数据编码与实例

针对不同的数据,QR码设计了不同的数据编码编码方式,我们可以根据数据的种类选择合适的编码方式进行编码。

数字编码(Numeric)        :可编码0-9,10个数字,如果需要编码的数字的个数不是3的倍数,最后剩下的1或2位数会被转成4或7bits,其它的每3位数字会根据不同版本被编成 10,12,14bits

字符编码(Alphanumeric) :可编码0-9,大写的A-Z,以及9个其他的字符(space $ % * + – . / :);

8位字节模式(8-bit Byte)     :可编码JIS X 0201的8位Latin/Kana字符集

除此之外,QR还提供了其他的编码方式,每一个编码方式都有其独有的id进行标识,这些标识会记录在数据区的前端,使得解码器可以根据二维码使用的编码方式对数据进行解码

                                  图5   一些编码方式及其标识

纠错码

二维码存在4个级别的纠错等级,每个纠错级别可修正的错误与标识见图6,纠错级别越高,可以修正的错误就越多,需要的纠错码的数量也变多,相应的可储存的数据就会减少,版本1的二维码在L级别下可储存25个字符,在H级别下只能储存10个字符。

                             图6

下面给一个01234567在版本1下用数字编码(Numeric),选择的纠错级别是M的示例

第一步,将定位图案放到二维码中

                         图7

第二步:进行数据编码

根据图8,版本1下,采用Numeric Mode编码时,每三个数字需要10个bits进行标示

                                            图8

012 ->0000001100

345 ->0101011001

67 ->1000011

组合起来为

0000001100 0101011001 1000011

在数据的头尾加上一些标准要求的信息

数字个数 (8) = 0000001000

编码格式      =0001

终止符         =0000

组合起来为

0000001100 0101011001 1000011->

0001 0000001000 0000001100 0101011001 1000011 0000

按8bit一组重新排列,末尾不足的补零

0001 0000001000 0000001100 0101011001 1000011 0000->

00010000 00100000 00001100 01010110 01100001 10000000

不足最大bit的添加补齐码(11101100 00010001),版本1 M下需要128bits

00010000 00100000 00001100 01010110 01100001

10000000->

00010000 00100000 00001100 01010110 01100001

10000000 11101100 00010001 11101100 00010001

11101100 00010001 11101100 00010001 11101100

00010001

第三步:添加纠错码

纠错码根据数据利用RS算法来进行计算,篇幅所限,这里就不具体讲解了,最终的结果如下:

00010000 00100000 00001100 01010110 01100001

10000000 11101100 00010001 11101100 00010001

11101100 00010001 11101100 00010001 11101100

00010001->

00010000 00100000 00001100 01010110 01100001

10000000 11101100 00010001 11101100 00010001

11101100 00010001 11101100 00010001 11101100

00010001 10100101 00100100 11010100 11000001

11101101 00110110 11000111 10000111 00101100

01010101

第四步:将最终的数据编码按顺序放入二维码中

                      图9                                                                       图10

从左下角开始,1为黑色,0为白色,按顺序依次填入二维码中

第五步:添加格式信息和进行掩码运算

得到的图像还需要对数据区进行掩码运算,掩码运算的目的是让图像中黑色和白色方块分布的更加均匀一些,便于解码

有以下几种掩码运算,相应的标识和变换方式见图11,二维码的左上角的坐标为(0,0)

                                               图11

                              图12  坐标系和掩码运算的图案

这里我们选择标识为011的掩码

格式信息的组成为                       :纠错标识+掩码标识+BCH纠错码

所以前面的纠错标识+掩码标识为:00011

BCH纠错码计算为:

得到纠错码为                             :011 0101 1001

格式信息为                                :00011 1101011001

为了避免选择标识00的纠错类别和标识000的掩码运算,照成格式信息为全0的数字,所得的格式信息还要与101010000010010做异或运算

000111101011001

101010000010010   XOR

101101101001011

最终的格式信息为                      :101101101001011

将格式信息放入二维码中       

                          图13

对加格式信息后的二维码 进行掩码运算

得到的最终二维码,储存的数据信息是01234567

                      图14

整个流程见图15

                                      图15

四、二维码的安全知识

虽然二维码本身承担的只是一些文本数据,但仍会导致一些安全问题

1、攻击者将一些恶意网站或者一些恶意代码制作成二维码,用户扫描后,会自动下载一些恶意软件,或跳转到一些虚假网站给使用者造成危害,

2、二维码内如果包含一些可执行的脚本,便可能导致xss攻击     如 http://www.wooyun.org/bugs/wooyun-2012-09145

3、如果将一些敏感信息不加密而直接储存在二维码中,便会存在信息泄露的可能,比如11年火车票上的二维码就存在泄露使用者的身份证号码的问题。

五、总结

虽然我们在使用二维码的时候只需要用手机一扫即可,但二维码的编码和解码却包含了很多的步骤和很多的知识,此外二维码本身仅仅是数据的承载体,我们在使用时要针对一些敏感信息进行加密处理,防范潜在的攻击方式

参考文献

二维码的生成细节和原理  http://coolshell.cn/articles/10590.html#jtss-tsina

QR二维码的攻击与防御   http://drops.wooyun.org/tips/160

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏何俊林

利用FFmpeg玩转Android视频录制与压缩

本文为剑西独家授权发布,剑西也是做Android多媒体开发,算是同道中人,不过他主要集中在视频压缩,利用FFmpeg,能做很多事,但是做到效果好,却不多。今天看...

1K5
来自专栏Coding01

推荐一个制作「ASCII 流程图」工具——Graph Easy

我不止一次看到类似「知乎」网站那种 Console 上直接输出这种「ASCII 文本」。

1632
来自专栏嵌入式程序猿

【电机控制不得不学习的干货:】 飞思卡尔MCU正交编/解码器模块

在电机控制领域,我们经常需要得到电机的转速,位置来执行算法,那么想知道转速是如何获得的吗?看过来,猿来你在这里O(∩_∩)O~ 正交编码器简介 飞思卡尔增强型正...

28611
来自专栏落影的专栏

Audio Unit播放PCM文件

前言 相关文章: 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 使用AudioToolbox编码AAC 使...

5066
来自专栏韩东吉的Unity杂货铺

零基础入门 41:Hierarchy也可以这样玩

上一篇给大家说了下Inspector如何禁用RectTransform属性修改的做法,今天就来分享下对Hierarchy的另一种操作。

985
来自专栏Python小屋

Python tkinter版猜数游戏

程序启动后,首先需要启动一次游戏并设置数值范围和猜测次数,然后可以猜数并输入,程序会根据实际情况进行大小提示,退出程序时提示战绩,例如共玩几次和成功几次。 im...

3955
来自专栏Python数据科学

手把手教你制作一个动态炫酷的可视化图表(历年中国大学学术排行榜)

摘要::最近在朋友圈看到一个很酷炫的动态数据可视化表,介绍了新中国成立后各省GDP的发展历程,非常惊叹竟然还有这种操作,也想试试。于是,照葫芦画瓢虎,在网上爬取...

2.9K9
来自专栏开源FPGA

Verilog 99题之001-009

002. 反相器的速度与哪些因素有关?什么是转换时间(transition time)和传播延迟(propagation delay)?

1552
来自专栏前端新视界

响应式卡片抽奖插件 CardShow

GitHub: https://github.com/nzbin/CardShow/ Demo: https://nzbin.github.io/CardS...

2856
来自专栏PPV课数据科学社区

数据流编程教程:R语言与DataFrame

DataFrame DataFrame 是一个表格或者类似二维数组的结构,它的各行表示一个实例,各列表示一个变量。 一. DataFrame数据流编程 ? 二....

45912

扫码关注云+社区

领取腾讯云代金券