密码学BCH纠错编码算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
密码学BCH 纠错编码算法实验报告
实验项目名称:BCH 纠错编码算法实验
专业班级: 信息082 ;姓名: 原亚珍 ;学号 200812030207 实验起止日期: 2010 年 5 月10日起 2011 年 6 月 1 日止
实验目的:
通过实验熟练掌握BCH 纠错编码算法,学会BCH 纠错编码算法程序设计,提高C++程序设计能力。
实验要求:
开发环境要求:
软件环境:windows98/windowsXP/windows2000,C++环境
硬件环境:计算机(C++, 512MRAM ,60G 以上硬盘,输入输出设备)
技术文档要求:
按照实验报告编写要求进行。要求流程图绘制规范,软、硬件功能描述清晰,实验总结深刻。
实验内容:
1.算法原理:
(一)编码矩阵和校验矩阵:
对),(l n 编码系统,当3,6==l n 时,构造编码矩阵G 和校验矩阵H 使得:
(1)G 能对三位明文=m (321,,m m m )作用后得到一个6位的发送字w ,即G m w ⨯=,
发送字w 的后三位为校验位。
(2) 将发送字w 发送后,收方的接受字为r ,若r 中仅有一位错,校验矩阵H 能校验
出哪位错并可予以纠错。
构造校验矩阵H 的理论依据为:n l n ⨯-)(的校验矩阵能正确纠正一位错误的充要条 件是H 的各列为不相同的非零矢量。
)|(A E G = E 为l l ⨯的矩阵,则G 为n l ⨯的矩阵;
)_|('E A H = E _为)()(l n l n -⨯-矩阵,'
A 为A 的转置,H 为n l n ⨯-)(的矩阵;
e w r += e 是误差;
''''')(e H e H w H e w H r H ⨯=⨯+⨯=+⨯=⨯
若'0H e ⨯≠,可由'e H ⨯看出究竟第几位出错并给予纠正。
(二)纠错算法:
(1)计算'r H S ⨯=;
(2)若0=S ,则可认为传输过程是正确的,则明文 321r r r m = (m 是l 长的明文序
列),若0S ≠,转(3);
(3)若S 是矩阵H 的第i 列则认为i r 有错误,予以纠正,然后取前面的l 位作为明文; 若S 不是矩阵H 的列矢量(且不为零),则认为传输过程至少出现两位以上的错误,
无法正确纠错。
2.流程图
Y
N
Y N
写入检验矩阵H 输入被检验的15个数据 计算校验子S 值 S 与H 中任一列相比
相等? 错一位,根据错误位置指示纠错 结束 S 与H 中任二列相比
相等? 错两位,根据错误位置指示纠结束
错两位以上,无法纠错
实验任务:
1.编码BCH纠错编码程序2.编辑录入
3.记录调试及运行情况
程序的调试:
运行结果:
4.编写程序结构说明文档
5.编写程序使用说明文档
实验讨论:
本次编程用到了一些矩阵方面的知识。首先将检验矩阵与输入的矩阵相乘得到校验子矩阵,如果校验子矩阵中的元素全部为0的话,就说明输入数据没有错误。如果不是全为0,将校验子矩阵与检验矩阵中的每一列相比较,如果有一列与校验子矩阵相等的话,就说明输入数据只错了一位;否则说明错误不只一位,将检验矩阵的每两列相加,如果其中两列相加的结果与校验子相同的话说明是此两位数据出错,如果任何两列相加的结果都不与校验子相同的话就说明错误的位数超过两位。
密码学设计性实验收获与总结:
通过本次实验,我对BCH纠错码有了比较深刻的理解,学会了编写BCH纠错码对一串数据进行纠错,在实验过程中提高了自己的逻辑思维能力以及C++程序设计能力。
在实验中遇到了很多的问题,通过实验的设计,让我发现了自己的不足。自己在学习知识上面的漏洞。自己在细节方面的考虑还不够全面,很多细节都是通过调试才发现的。希望通过弥补这些发现的漏洞,提高自己的专业知识水平。编程过程中,代码总是重复的修改,在很多问题上,代码并不是最优的。相信在以后的学习中,随着知识的增多,遇到的问题会越来越少!
参考文献:
《计算机密码学》卢开澄编著清华大学出版社
《现代密码学》陈鲁生沈世镒编著科学出版社
《C++程序设计》谭浩强编著清华大学出版社附录:源程序代码
#include
using namespace std;
const int M=8;
const int N=15;
int Index(unsigned int H[][N],unsigned int r[M])
{//若矩阵H包含矩阵r,则返回下标值;否则,返回-1 int i,j;
for(j=0;j { for(i=0;i { if(H[i][j]!=r[i]) break; } if(i==M) return j; } return -1; } bool iszero(unsigned int r[M],int M) {//若矩阵为零矩阵,则返回1;否则,返回0 int i; for(i=0;i if(r[i]!=0) return 0; return 1; } int main() { int i,j,k,temp; unsigned int w[N],r[M]; unsigned int H[M][N]= {1,0,0,0,1,0,0,1,1,0,1,0,1,1,1, 0,1,0,0,1,1,0,1,0,1,1,1,1,0,0, 0,0,1,0,0,1,1,0,1,0,1,1,1,1,0, 0,0,0,1,0,0,1,1,0,1,0,1,1,1,1, 1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1, 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, 0,1,1,1,1,0,1,1,1,1,0,1,1,1,1};//校验矩阵H[M][N] cout<<"\t\t*********\n\t\tBCH纠错码\n\t\t********* "< cout<<"校验矩阵H["< for(i=0;i { for(j=0;j cout< cout< } cout<<"\n请输入接收序列w["< for(i=0;i cin>>w[i]; cout<<"接收序列w["< for(i=0;i cout< cout< for(i=0;i