本系列前面两篇已经介绍了纠错码的基本原理和在魔术中的应用和一些魔术例子,相关内容请戳: 纠错码与魔术(二)——魔术《矩阵感应》等 纠错码与魔术(一)——纠错码与汉明码简介 在mathematical 扫描二维码 关注更多精彩 纠错码与魔术(二)——魔术《矩阵感应》等 破解魔术的秘密(四)——前移原理介绍和案例分享 你真的分得清“前后左右”和“东西南北”吗?
在上一篇中,我们介绍了两个汉明纠错码思想构造的魔术,哪两个都是最基本的应用,相关内容请戳: 纠错码与魔术(三)——汉明纠错码魔术初步 纠错码与魔术(二)——魔术《矩阵感应》等 纠错码与魔术(一)—— 纠错码与汉明码简介 而今天是本系列最后一篇,仍然是汉明编码的魔术,但是其使用的巧妙程度和层级要更深,魔术效果也更好。 好了,这就是这个小而美的《纠错码与魔术》系列的四篇文章,在通信编码系列里,还有更多系列等着和大家见面,下个系列见! 扫描二维码 关注更多精彩 纠错码与魔术(三)——汉明纠错码魔术初步 破解魔术的秘密(四)——前移原理介绍和案例分享 你真的分得清“前后左右”和“东西南北”吗?
这个时候, 纠错码出现了. 简单介绍一下, 其中所有有关数学的内容的去掉了, 毕竟太高深, 咱也不懂. 思考 因为计算机传输中只存在0和1, 所以可以简单将其类比为数字. 这种纠错方式被称为: 二维奇偶校验码. ---- 计算机硬盘, 网络通信等都有着纠错码的身影, 它保证了数据的传输可靠. 在TCP的每个包中都存在校验和内容, 若校验出错, 则包会被直接丢弃.
今天我们来学习编码中一个非常重要的编码类型——纠错码,以及自然地,这种纠错码的思想是如何应用到魔术中的。 这一篇,我们从纠错码的基本原理说起。 此外,还有作为散列函数的循环冗余校验CRC,以及加密散列函数等,而格雷码则是在编码的过程中引入相邻数代码仅有1位不同,使得其自动具有纠错码的功能。 Hamming Code 汉明码,是一种线性纠错码,由汉明于1950年发明。相比而言,简单的奇偶校验码除了不能纠正错误之外,也只能侦测出奇数个的错误。 设待传输的信号长度为k位,我们试图寻找一个长度为n的编码,带(n - k)位纠错码,能够保证定位到1位错误以及其位置。
纠错码可以帮助 QR 读码器检测 QR 二维码中的错误并予以校正。继对文本数据编码后,本篇将继续介绍生成纠错码的过程。 codeword #7) 01010101 (codeword #8) 11000010 (codeword #9) 01110111 (codeword #10) 00110010 (codeword #11 ^8 = 256 XOR 285 = 100000000 XOR 100011101 = 29 2^9 = 2^8 * 2 = 29 * 2 = 58 2^10 = 58 * 2 = 116 2^11 第八步:生成纠错码 终于,我们走到了生成纠错码这一环节。 01000011 01000000 11101100 00010001 11101100 00010001 11101100 00010001 将二进制转化为十进制数字得到 16 个数字: 32, 91, 11
HRHF算法通过结合纠错码与SM3算法的Merkle-Damgård迭代结构,不仅增强了哈希值的随机性,还保证了算法的安全性和执行效率。 HRHF算法结合了纠错码与SM3算法的Merkle-Damgård迭代结构,通过这种方式增强了哈希值的随机性。 计算纠错码的生成矩阵。 对生成矩阵进行循环左移操作以增加随机性。 对输入数据进行迭代压缩操作。 输出最终的256位哈希值。
在本系列前面的文章里,我们已经介绍了纠错码的基本原理和Hamming码的内容,相关内容请戳: 纠错码与魔术(一)——纠错码与汉明码简介 今天我们来具体聊聊纠错码和魔术之间的关系,以及一个经典作品等。 比较神奇的是,纠错码居然可以在信息还没有到来之前就好像完成了这个编码,使得看起来是一种以不变应万变的编码方式,靠发信者自己去暴露自己的信息。 好了,说了这么多,我们来通过真正的魔术案例来说明这些纠错码在魔术上到底是怎么被应用的。 矩阵感应 视频1 矩阵感应 这是一个典型的奇偶校验码,是我在深大的一次沙龙里,Albert老师第一次表演的。 这也是纠错码原理比一般的通信编码的优势,在做出选择以后到完成辨识以前,不再需要托来传递什么信息,信息早就暗含在了纠错码代表的这些隐含关系的成立与破坏中。 扫描二维码 关注更多精彩 纠错码与魔术(一)——纠错码与汉明码简介 破解魔术的秘密(四)——前移原理介绍和案例分享 你真的分得清“前后左右”和“东西南北”吗?
经过生成纠错码环节,目前我们已经拥有了数据编码和其对应的纠错码。最初我们提到过,较大的 QR 二维码需要我们数据码拆成小块,而且针对每一块生成对应的纠错码。 在这种情况下,数据块和纠错码必须根据 QR 二维码规范穿插放置,本篇将解释该过程。 第一步:决定需要多少数据块和纠错码 纠错表展示了每种 QR 二维码版本在不同纠错级别下所需的数据块和纠错码数字。 这种情况下不需要穿插放置码块,直接将纠错码字节放在数据码字节后即可跳过本篇进入下一环节。 同时由纠错表查得 5-Q 码的纠错码个数为每块 18 个,这里总共有 4 个块,所以需要 4 组 18 个的纠错码。生成结果如下: ? 接下来我们看下穿插放置码块的过程。 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17, 7, 236, 213, 87, 148, 235, 199, 204, 116, 159, 11
结论: 纠错码的存在不是 “用一个数据去保护所有数据” 而是 “通过一个数据改变整组数据的奇偶性”,纠错码本身就存在于整组数据中。换而言之,纠错码在保护其他数据的同时,也保护了纠错码自身。 将数据矩阵还原成横向排列: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 - - - - 3.2 汉明码矩阵 现给定一个 4x4 的汉明码矩阵,并规定 11 号位置为比特翻转的错误数据,并将所有位置的角标以二进制表示: image.png 规定奇偶校验的结果:若某个区域出现了错误记录为1, 反之记录为0; 三四行 二四行 三四列 二四列 1 0 1 1 将得到结果进行拼接得到 1101 刚好对应的十进制是 11 位 奇偶校验结果的排列组合都必然代表了一组位置(标识: ^ 1 ^ 1 = 1 1000 第三列 0 ^ 1 ^ 0 ^ 1 ^ 1 ^ 1 = 0 1100 第四列 0 ^ 0 ^ 1 ^ 1 ^ 1 ^ 1 = 1 1110 1111 1011 这是第11
数据码和纠错码 除了上述的那些地方,剩下的地方存放 数据码 和纠错码。 如下所示(两个表,中英文对照):(其中的SP是空格,Char是字符,Value是其索引值),编码的过程是把字符两两分组,然后转成下表的45进制,然后转成11bits的二进制,如果最后有一个落单的,那就转成 而字符计数指示符需要根据不同的Version尺寸编成9, 11或13个二进制(如上表)。 ? ? 我们计算一下,22个数据码字,就是176个bit,而20个字符,在编码的时候分为10组,每组11个bit,所以4+9+10*11=123个bit,123/8=15余3,再加上4个0(结束符) ,以及8bit 我们就可以使用纠错码恢复原本的数据。 9. 编写脚本利用python的reedsolo模块进行纠错。 ? 10. 得到全部的信息。 ? 11. 拆分和解码 ?
首先得到编码模式指示符:字节编码对应 0100 其次计算文本信息中字符数,"HELLO WORLD" 10 个字母 1 个空格共计 11 个字符,转化为 9 位的二进制串:000001011 字符编码 然后将每组中第一个字符索引值乘以 45 加上第二个字符索引值,将结果转化为 11 位的二进制数,不足 11 位在左侧补 0 以达到长度。 将之前产生的 128 位数据编码每 8 位一组,每组转化为 10 进制数字,由此得到 16 个数字: 32, 91, 11, 120, 209, 114, 220, 77, 67, 64, 236, 通过信息多项式与生成多项式除法(过程较复杂,详情可见《QR 二维码纠错码(三)》),我们可以得到 10 个纠错码: 196 35 39 119 235 215 231 226 93 23 掩码只对我们填充的 208 为数据编码和纠错码进行处理,其余预先填好的功能模块和预留区域都不受掩码影响。 经过掩码处理后的 QR 二维码结果如图: ?
二维码的生成原理涉及到编码过程和纠错码的生成。以下是基本的步骤: 1.数据编码:首先,需要将需要存储的数据转换为二进制码。 2.生成纠错码:为了提高二维码的识别率,需要为每个字符生成一组纠错码。纠错码的作用是检测和修正错误,通常采用的是Reed-Solomon编码。 3.模块排列:将数据和纠错码按照一定的规则排列到二维码矩阵中。具体的排列方式取决于二维码的类型和版本。 QR码支持如下的编码: Numeric mode 数字编码,从0到9。 如下所示:(其中的SP是空格,Char是字符,Value是其索引值) 编码的过程是把字符两两分组,然后转成下表的45进制,然后转成11bits的二进制,如果最后有一个落单的,那就转成6bits的二进制。 而编码模式和字符的个数需要根据不同的Version尺寸编成9, 11或13个二进制 参考github https://github.com/davidshimjs/qrcodejs
为什么纠错码有用 与RAID或复制不同,纠错码可以保护数据不受多个驱动器故障的影响。 比如,在经典的RAID6中可以在损失两块盘的情况下不丢数据,然而在Minio中纠错码可以保证当一般的盘故障时依然不会影响到数据。此外,纠错码在在对象级别,并且每次就可以修复一个对象。 而在Minio内部的设计中采用了高速的HighwayHash校验和来保护Bit Bot Drivers是如何使用纠错码的 MinIO将您提供的驱动器分为4、6、8、10、12、14或16个驱动器的纠错码集 /data6 /data7 /data8 /data9 /data10 /data11 /data12 # 使用docker方式运行有8驱动器的minio服务 $ docker run -p 9000 一个分布式的Minio集群最小需要4块盘(其实是纠错码要求最小4块)来驱动整个集群,当我们启动分布式集群后,纠错码会自动启动 高可用: 多节点组成的分布式minio可保证服务的高可用(一个N节点的分布式
数据和纠错码:记录了数据信息和相应的纠错码,纠错码的存在使得当二维码的数据出现允许范围内的错误时,也可以正确解码。 版本信息 :仅在版本7以上存在,记录具体的版本信息。 按顺序依次填入二维码中 第五步:添加格式信息和进行掩码运算 得到的图像还需要对数据区进行掩码运算,掩码运算的目的是让图像中黑色和白色方块分布的更加均匀一些,便于解码 有以下几种掩码运算,相应的标识和变换方式见图11 图11 ? BCH纠错码计算为: ? 便可能导致xss攻击 如 http://www.wooyun.org/bugs/wooyun-2012-09145 3、如果将一些敏感信息不加密而直接储存在二维码中,便会存在信息泄露的可能,比如11
第一组的属性: 纠错块个数 = 2:该组中有两个块; (c, k, r) = (33, 11, 11):该组中每个块共有 33 个码字,其中 11 个数据码, 11×2=22 个纠错码; 第二组的属性: 纠错块个数 = 2:该组中有两个块; (c, k, r) = (34, 12, 11):该组中每个块共有 34 个码字,其中 12 个数据码, 11×2=22 个纠错码; 具体示例如下表所示,且由于使用二进制会使得表格过大 其中组 1 的每个块,都有 11 个数据码, 22 个纠错码;组 2 的每个块,都有 12 个数据码,22 个纠错码。 组 块 数据 每个块的纠错码 1 1 2 67 85 70 134 87 38 85 194 119 50 6 66 7 118 134 242 7 38 86 22 198 199 199 11 纠错码如下表所示: 块数 块1 199 11 45 115 247 241 223 229 248 154 117 块2 177 212 76 133 75 242 238 76
数据码和纠错码 除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。 数据编码 我们先来说说数据编码。 如下所示:(其中的SP是空格,Char是字符,Value是其索引值) 编码的过程是把字符两两分组,然后转成下表的45进制,然后转成11bits的二进制,如果最后有一个落单的,那就转成6bits的二进制。 而编码模式和字符的个数需要根据不同的Version尺寸编成9, 11或13个二进制(如下表中Table 3) ? Byte mode, 字节编码,可以是0-255的ISO-8859-1字符。 两两分组: (10,12) (41,4) (2) 3.把每一组转成11bits的二进制: (10,12) 10*45+12 等于 462 转成 00111001110 (41,4) 41*45+4 等于 ,所以,我都用了十进制,我们可以看到每一块的纠错码有18个codewords,也就是18个8bits的二进制数) 组 块 数据 对每个块的纠错码 1 1 67 85 70 134 87 38 85 194
3、纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。 在二维码规格和纠错等级确定的情况下,其实它所能容纳的码字总数和纠错码字数也就确定了,比如:版本10,纠错等级时H时,总共能容纳346个码字,其中224个纠错码字。 ,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。 如:D1, D12, D23, D35, D2, D13, D24, D36, … D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46 数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。
昨天的控件点击时通过外面,加个 listener。然后如果外部设定当前选中位置,也要刷新一下页面,所以刷新逻辑放到设置 textSelectedIndex 中去。
上一篇构建最终编码流程中,我们获取到最终包含数据码、纠错码和剩余字符的最终编码数据。接下来就是要最终的数据编码和其它必需的功能模块统一分配到 QR 二维码矩阵中。 因此,在除法步骤之前,先确保目前生成的二进制串长度要大于等于 11 位(11 位是生成多项式二进制位的长度)。目前我们的是 1100 00000 00000 总共 14 位。 该 10 位结果即所求的 10 位纠错码。 18 位版本信息中,首 6 位是版本号转化为 6 位二进制结果,剩余 12 位是 6 位版本号对应的 12 位纠错码。 生成过程与格式信息中的纠错码过程类似,不过对应的是 12 位并且最终无需与掩码 XOR 运算。
但海明码是理解更复杂的纠错码的基础,通过对海明码的理解,可以理解纠错码的基本原理,强烈建议在理解LTE Turbo码和NR的Polar码之前,先理解海明码的原理!!! 海明码是最简单的纠错码,通过理解海明码,可以理解纠错编码工作原理: 如何发现错误比特所在的比特位; 纠错码是如何纠错的? 其中发现错误比特的位置是根本。 备注:校验正确 出错的第2个校验:2,3,6,7,10,11 出错的第4个校验:4,5,6,7,12 正确的第1个校验:1,3,5,7,9,11 结论:第6位出错,第7位不出错。 或者说,先把待编码的数据进行分组,冗余纠错码信息是插入到每个分组块的尾部,而不是以整个数据比特块的尾部。因此,纠错码,又称为分组纠错码。 短码:只有K>11是才采用Polar码,且长度不同,采用不同的Polar码编码选项。