首页 > 编程学习 > 基于分组码的消息验证码的程序实现

基于分组码的消息验证码的程序实现

发布时间:2022/11/19 0:31:15

目 录
摘 要 I
1 绪论 1
1.1 课题研究背景和意义 1
1.2 课题研究现状 1
2 CBC MAC的特征和基本工作原理 2
2.1 CBC MAC的特征和码集选择的原则 2
2.2 CBC MAC生成原理 2
2.3 CBC MAC模块结构图 3
3 FPGA和VHDL语言 4
3.1 概述 4
3.2 VHDL语言特点 5
3.2.1 常用硬件描述语言简介 5
3.2.3 VHDL程序的基本结构 6
3.3 Quartus II 简介 6
4 程序实现及结果分析 8
4.1 设计方案论证 8
4.2 生成模块设计 8
4.2.1 设计原理 8
4.2.2 仿真波形 9
4.3 校验模块设计 9
4.3.1 设计原理 9
4.3.2 仿真波形 10
4.4 顶层设计 10
4.4.1 顶层设计原理 10
4.4.2 顶层设计仿真波形 11
参考文献 12
附 录 13
致 谢 16
1.2 课题研究现状
循环码是具有循环移位特性且能纠错的分组码。纠错码的译码是该编码能否得到实际应用的关键所在。译码器往往比编码较难实现,对于纠错能力强的纠错码更复杂。根据不同的纠错或检错目的,循环码译码器可分为用于
纠错目的和用于检错目的的循环码译码器。任何两个相邻的循环码只有一位数字不同,因此循环码具有可靠性高的优点,在通信、军事等领域中应用非常广泛。由于循环码是无权码,书写和编制都比普通二进制码麻烦,正确的编制是电路设计的关键。
目前常用的实现CBC MAC编码语言有C语言、Verilog和VHDL语言。但由于VHDL有更强的行为描述能力及其对硬件设计的独立性,从而避开具体的器件结构,从逻辑行为上描述和设计该电子系统使得程序实现较为方便。从以上方面考虑,本设计中采用VHDL程序实现。

2 CBC MAC的特征和基本工作原理
2.1 CBC MAC的特征和码集选择的原则
CBC MAC即分组码的消息验证码是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。但是信息字段和校验字段的长度也要满足一定的要求,即有码集选择原则。
CBC MAC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CBC MAC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得 V(x)=A(x)g(x)=xRm(x)+r(x);
  其中: m(x)为K-1次信息多项式, r(x)为R-1次校验多项式,
  g(x)称为生成多项式:
  g(x)=g0+g1x1+ g2x2+…+g(R-1)x(R-1)+gRxR
  发送方通过指定的g(x)产生CBC MAC码字,接收方则通过该g(x)来验证收到的CBC MAC码字。
2.2 CBC MAC生成原理
经过CBC MAC方式编码的串行发送序列码,可称为CBC MAC码,共有两个部分组成:k位有效信息数据和r位CBC MAC校验码。其中r位CBC MAC校验码是通过k位有效信息序列被一个事先选择的r+1位“生成多项式”相“除”后得到的(r位余数即是CBC MAC校验码)。CBC MAC校验码一般在有效信息发送时产生,拼接在有效信息后被发送;在接收端,CBC MAC码用同样的生成多项式相除,除尽表示无误,弃掉r位CBC MAC校验码,接收有效信息;反之,则表示传输出错,纠错或请求重发。
实际的CBC MAC校验生成是采用二进制模2算法得到的,即加法不进位,减法不借位,是一种异或操作。生成多项式G(x)是经过严格的数学分析和实验后确定的,有相应的国际标准。

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164. ALL;
USE IEEE.STD_LOGIC_UNSIGNED. ALL;
USE IEEE.STD_LOGIC_SIGNED. ALL;
USE IEEE.STD_LOGIC_ARITH. ALL;
ENTITY CBC MACm IS
	PORT ( clk,datald : IN STD_LOGIC;
		sdata   :IN STD_LOGIC_VECTOR(11 DOWNTO 0);
		dataCBC MACo:OUT STD_LOGIC_VECTOR(16 DOWNTO 0);
		hsend :out std_logic);
end CBC MACm;
architecture one of CBC MACm is
	constant multi_coef:std_logic_vector(5 downto 0):="110101";
	signal cnt:std_logic_vector(4 downto 0);
	signal sdatam:std_logic_vector(11 downto 0);
	signal dtemp,rdataCBC MAC:std_logic_vector(16 downto 0);
	signal st:std_logic:='0';
begin
process(clk)
	variable CBC MACvar:std_logic_vector(5 downto 0);
begin
	if (clk'event and clk='1') then
	if (st='0' and datald='1') then dtemp<=sdata &"00000"; 
        sdatam<=sdata; cnt<= (others=>'0'); hsend<='0'; st<='1'; 
elsif(st='1' and cnt<12) then cnt<=cnt+1;  
	if(dtemp(16)='1') then CBC MACvar:=dtemp(16downto11) xor multi_coef;
		       dtemp<=CBC MACvar(4 downto 0) & dtemp(10 downto 0) & '0';
			else dtemp<=dtemp(15 downto 0) & '0'; 
			end if;
elsif(st='1' and cnt=12) then dataCBC MACo<=sdatam & dtemp(16 downto 12);
			hsend<='1'; cnt<=cnt+1;
		elsif(st='1' and cnt=13) then hsend<='0'; st<='0';
		end if;
	end if;
end process;
end one;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式