基于FPGA的DES加解密verilog实现

这篇具有很好参考价值的文章主要介绍了基于FPGA的DES加解密verilog实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       DES(Data Encryption Standard)是一种对称密钥加密算法,是目前应用最广泛的加密算法之一。它是由美国国家标准局(National Institute of Standards and Technology,NIST)于1977年发布并公开的,用于保护计算机系统中的数据安全。DES算法采用了分组密码的技术,将明文按照一定的规则分组后,经过多轮加密运算得到密文。DES算法的密钥长度为56位,明文分组长度为64位,加密过程中采用了置换、代换、移位、异或等基本操作。

        FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,它可以通过编程实现各种数字电路的功能。FPGA具有高性能、低功耗、可重配置等优点,被广泛应用于数字信号处理、通信、图像处理等领域。在加解密算法中,FPGA可以实现高速、低延迟的数据加解密运算,具有非常重要的应用价值。本文将介绍基于FPGA的DES数字加解密算法,包括DES算法的原理、FPGA的基本概念、基于FPGA的DES算法实现等内容。

DES算法的原理

DES算法的加密过程可以分为以下几个步骤:

       初始置换(IP),将64位明文按照固定的置换表IP变换为56位数据块。该置换表是由DES算法设计时确定的,不能改变。

       密钥的生成,DES算法的密钥长度为56位,但是实际上只有48位用于加密运算。为了使密钥更加安全,DES算法采用了密钥的变换方式,将56位的密钥变换为16个48位的子密钥。这个过程是通过将原始密钥进行置换、分割、移位、压缩等操作得到的。

分组加密
      将初始置换后的明文分为左右两个32位的数据块,然后对这两个数据块进行16轮加密运算。每轮加密运算都是将右侧的32位数据块作为输入,与对应的48位子密钥进行异或运算,然后通过代换、置换等操作得到新的32位数据块,再将左侧的32位数据块与新的右侧32位数据块进行异或运算,最终得到新的左右两个32位数据块。

逆置换(IP^-1)

       将最后一轮加密得到的左右两个32位数据块进行合并,然后通过逆置换IP^-1得到最终的64位密文。

DES算法的解密过程与加密过程基本相同,只是子密钥的使用顺序与加密过程相反。

基于FPGA的DES算法实现

基于FPGA的DES算法实现主要包括以下几个步骤:

确定FPGA的型号和开发板
       FPGA的型号和开发板决定了DES算法的实现效率和可扩展性。一般来说,选择性能较高的FPGA型号和支持高速通信接口的开发板可以提高DES算法的加解密速度和数据处理能力。

设计DES算法的硬件电路
       DES算法的硬件电路主要包括初始置换(IP)、密钥生成、分组加密和逆置换(IP^-1)等模块。这些模块可以通过可编程逻辑单元(Logic Cell)和块RAM存储单元等资源进行实现。其中,密钥生成和分组加密模块需要大量的逻辑单元和存储单元进行实现。

编写DES算法的控制程序
       DES算法的控制程序主要负责控制各个模块的数据流动和时序,实现DES算法的全流程。控制程序可以使用硬件描述语言(HDL)进行编写,如Verilog、VHDL等,也可以使用高级语言(如C语言)进行编写,然后通过编译器和综合工具转换成硬件描述语言。

进行FPGA逻辑电路的布局和布线
      布局和布线是将逻辑电路映射到FPGA硬件资源上的过程。布局是将逻辑电路映射到FPGA芯片上的物理位置,布线是将逻辑电路中的信号映射到FPGA芯片上的可编程连接资源上。

进行FPGA逻辑电路的编译和下载
       编译是将设计好的硬件电路转换成FPGA可以识别的二进制文件的过程。下载是将编译好的

二、核心程序

.........................................................................
always @(  data_i or   key_i or   load_i or   stage1_iter or   data_ready or stage1_R_o or stage1_L_o or stage1_round_key_o)

begin
      
   L_i_var=0;
   R_i_var=0;
   data_i_var=0;
   
   next_ready_o = (0);
   next_data_ready = (data_ready);
   next_stage1_iter = (stage1_iter);

   stage1_L_i = (0);
   stage1_R_i = (0);
   stage1_round_key_i = (0);
	

   key_i_var=key_i;
	
   key_var_perm[55]=key_i_var[7];key_var_perm[54]=key_i_var[15];key_var_perm[53]=key_i_var[23];key_var_perm[52]=key_i_var[31];
   key_var_perm[51]=key_i_var[39];key_var_perm[50]=key_i_var[47];key_var_perm[49]=key_i_var[55];key_var_perm[48]=key_i_var[63];

   key_var_perm[47]=key_i_var[6];key_var_perm[46]=key_i_var[14];key_var_perm[45]=key_i_var[22];key_var_perm[44]=key_i_var[30];
   key_var_perm[43]=key_i_var[38];key_var_perm[42]=key_i_var[46];key_var_perm[41]=key_i_var[54];key_var_perm[40]=key_i_var[62];
	
   key_var_perm[39]=key_i_var[5];key_var_perm[38]=key_i_var[13];key_var_perm[37]=key_i_var[21];key_var_perm[36]=key_i_var[29];
   key_var_perm[35]=key_i_var[37];key_var_perm[34]=key_i_var[45];key_var_perm[33]=key_i_var[53];key_var_perm[32]=key_i_var[61];
   
   key_var_perm[31]=key_i_var[4];key_var_perm[30]=key_i_var[12];key_var_perm[29]=key_i_var[20];key_var_perm[28]=key_i_var[28];
   key_var_perm[27]=key_i_var[1];key_var_perm[26]=key_i_var[9];key_var_perm[25]=key_i_var[17];key_var_perm[24]=key_i_var[25];
   
   key_var_perm[23]=key_i_var[33];key_var_perm[22]=key_i_var[41];key_var_perm[21]=key_i_var[49];key_var_perm[20]=key_i_var[57];
   key_var_perm[19]=key_i_var[2];key_var_perm[18]=key_i_var[10];key_var_perm[17]=key_i_var[18];key_var_perm[16]=key_i_var[26];
   
   key_var_perm[15]=key_i_var[34];key_var_perm[14]=key_i_var[42];key_var_perm[13]=key_i_var[50];key_var_perm[12]=key_i_var[58];
   key_var_perm[11]=key_i_var[3];key_var_perm[10]=key_i_var[11];key_var_perm[9]=key_i_var[19];key_var_perm[8]=key_i_var[27];
   
   key_var_perm[7]=key_i_var[35];key_var_perm[6]=key_i_var[43];key_var_perm[5]=key_i_var[51];key_var_perm[4]=key_i_var[59];
   key_var_perm[3]=key_i_var[36];key_var_perm[2]=key_i_var[44];key_var_perm[1]=key_i_var[52];key_var_perm[0]=key_i_var[60];
   
	
   data_i_var=data_i;
   L_i_var[31]=data_i_var[6];L_i_var[30]=data_i_var[14];L_i_var[29]=data_i_var[22];L_i_var[28]=data_i_var[30];
   L_i_var[27]=data_i_var[38];L_i_var[26]=data_i_var[46];L_i_var[25]=data_i_var[54];L_i_var[24]=data_i_var[62];

   L_i_var[23]=data_i_var[4];L_i_var[22]=data_i_var[12];L_i_var[21]=data_i_var[20];L_i_var[20]=data_i_var[28];
   L_i_var[19]=data_i_var[36];L_i_var[18]=data_i_var[44];L_i_var[17]=data_i_var[52];L_i_var[16]=data_i_var[60];

   L_i_var[15]=data_i_var[2];L_i_var[14]=data_i_var[10];L_i_var[13]=data_i_var[18];L_i_var[12]=data_i_var[26];
   L_i_var[11]=data_i_var[34];L_i_var[10]=data_i_var[42];L_i_var[9]=data_i_var[50];L_i_var[8]=data_i_var[58];

   L_i_var[7]=data_i_var[0];L_i_var[6]=data_i_var[8];L_i_var[5]=data_i_var[16];L_i_var[4]=data_i_var[24];
   L_i_var[3]=data_i_var[32];L_i_var[2]=data_i_var[40];L_i_var[1]=data_i_var[48];L_i_var[0]=data_i_var[56];		   
		   		   
   R_i_var[31]=data_i_var[7];R_i_var[30]=data_i_var[15];R_i_var[29]=data_i_var[23];R_i_var[28]=data_i_var[31];
   R_i_var[27]=data_i_var[39];R_i_var[26]=data_i_var[47];R_i_var[25]=data_i_var[55];R_i_var[24]=data_i_var[63];

   R_i_var[23]=data_i_var[5];R_i_var[22]=data_i_var[13];R_i_var[21]=data_i_var[21];R_i_var[20]=data_i_var[29];
   R_i_var[19]=data_i_var[37];R_i_var[18]=data_i_var[45];R_i_var[17]=data_i_var[53];R_i_var[16]=data_i_var[61];

   R_i_var[15]=data_i_var[3];R_i_var[14]=data_i_var[11];R_i_var[13]=data_i_var[19];R_i_var[12]=data_i_var[27];
   R_i_var[11]=data_i_var[35];R_i_var[10]=data_i_var[43];R_i_var[9]=data_i_var[51];R_i_var[8]=data_i_var[59];

   R_i_var[7]=data_i_var[1];R_i_var[6]=data_i_var[9];R_i_var[5]=data_i_var[17];R_i_var[4]=data_i_var[25];
   R_i_var[3]=data_i_var[33];R_i_var[2]=data_i_var[41];R_i_var[1]=data_i_var[49];R_i_var[0]=data_i_var[57];	


   
   data_o_var_t[63:32]=stage1_R_o;
   data_o_var_t[31:0]=stage1_L_o;
   
   data_o_var[63]=data_o_var_t[24];data_o_var[62]=data_o_var_t[56];data_o_var[61]=data_o_var_t[16];data_o_var[60]=data_o_var_t[48];
   data_o_var[59]=data_o_var_t[8];data_o_var[58]=data_o_var_t[40];data_o_var[57]=data_o_var_t[0];data_o_var[56]=data_o_var_t[32];   
   
   data_o_var[55]=data_o_var_t[25];data_o_var[54]=data_o_var_t[57];data_o_var[53]=data_o_var_t[17];data_o_var[52]=data_o_var_t[49];
   data_o_var[51]=data_o_var_t[9];data_o_var[50]=data_o_var_t[41];data_o_var[49]=data_o_var_t[1];data_o_var[48]=data_o_var_t[33];
   
   data_o_var[47]=data_o_var_t[26];data_o_var[46]=data_o_var_t[58];data_o_var[45]=data_o_var_t[18];data_o_var[44]=data_o_var_t[50];
   data_o_var[43]=data_o_var_t[10];data_o_var[42]=data_o_var_t[42];data_o_var[41]=data_o_var_t[2];data_o_var[40]=data_o_var_t[34];
   
   data_o_var[39]=data_o_var_t[27];data_o_var[38]=data_o_var_t[59];data_o_var[37]=data_o_var_t[19];data_o_var[36]=data_o_var_t[51];
   data_o_var[35]=data_o_var_t[11];data_o_var[34]=data_o_var_t[43];data_o_var[33]=data_o_var_t[3];data_o_var[32]=data_o_var_t[35];
   
   data_o_var[31]=data_o_var_t[28];data_o_var[30]=data_o_var_t[60];data_o_var[29]=data_o_var_t[20];data_o_var[28]=data_o_var_t[52];
   data_o_var[27]=data_o_var_t[12];data_o_var[26]=data_o_var_t[44];data_o_var[25]=data_o_var_t[4];data_o_var[24]=data_o_var_t[36];   
   
   data_o_var[23]=data_o_var_t[29];data_o_var[22]=data_o_var_t[61];data_o_var[21]=data_o_var_t[21];data_o_var[20]=data_o_var_t[53];
   data_o_var[19]=data_o_var_t[13];data_o_var[18]=data_o_var_t[45];data_o_var[17]=data_o_var_t[5];data_o_var[16]=data_o_var_t[37];
   
   data_o_var[15]=data_o_var_t[30];data_o_var[14]=data_o_var_t[62];data_o_var[13]=data_o_var_t[22];data_o_var[12]=data_o_var_t[54];
   data_o_var[11]=data_o_var_t[14];data_o_var[10]=data_o_var_t[46];data_o_var[9]=data_o_var_t[6];data_o_var[8]=data_o_var_t[38];
   
   data_o_var[7]=data_o_var_t[31];data_o_var[6]=data_o_var_t[63];data_o_var[5]=data_o_var_t[23];data_o_var[4]=data_o_var_t[55];
   data_o_var[3]=data_o_var_t[15];data_o_var[2]=data_o_var_t[47];data_o_var[1]=data_o_var_t[7];data_o_var[0]=data_o_var_t[39];
   
   next_data_o = (data_o_var);
   
   stage1_iteration_i = (stage1_iter);

   next_ready_o = (0);	 	 
   stage1_L_i = (stage1_L_o);
   stage1_R_i = (stage1_R_o);
   stage1_round_key_i = (stage1_round_key_o);
    
   case(stage1_iter)
	
     0:
     begin
       if(load_i)
       begin
         next_stage1_iter = (1);
         stage1_L_i = (L_i_var);
         stage1_R_i = (R_i_var);
         stage1_round_key_i = (key_var_perm);
         next_data_ready = (0);
       end
       else if (!data_ready)
       begin

         next_stage1_iter = (0);	
         next_ready_o = (1);
         next_data_ready = (1);			 
       end
	 end
       
     15:
       next_stage1_iter = (0);
       
     default:	
       next_stage1_iter = (stage1_iter+1);		 
   
   endcase
 
end

endmodule
up217

三、仿真结论

基于FPGA的DES加解密verilog实现文章来源地址https://www.toymoban.com/news/detail-494348.html

到了这里,关于基于FPGA的DES加解密verilog实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言如何实现DES加密与解密

    在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码。废了半天劲,终于找到了问题所在。 下面先介绍一下des,了解des的同学可以直接看下面的解决办法。 Des加密 DES全称为Data EncryptionStandard,即数据加密标准。Des加密算法

    2024年02月12日
    浏览(42)
  • 关于怎么使用python实现 3DES 加密/解密

    3DES (Triple DES) 是一种对称加密算法,其特点是使用三次密钥加密来提高安全性。 3DES的原理是:对明文进行三次加密,每次加密的密钥不同。加密时,首先使用第一个密钥对明文进行加密,然后使用第二个密钥对加密后的数据进行解密,最后再使用第三个密钥对解密后的数据

    2024年02月15日
    浏览(40)
  • 如何实现 DES 加密,解密(uniapp/vue) + Java)

    目录  一、引言 二、 什么是DES?  三、实际操作  1. Uniapp 进行 des 加密/解密  2. Java 进行 des 加密/解密         现如今,加密是对数据安全处理的基本手段之一。今天我们的背景就是微信开发中,涉及到支付时用户个人信息的权限认证操作。今天使用的就是通过DES算法进

    2024年02月04日
    浏览(57)
  • 基于FPGA的移相波束形成verilog实现

    欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果

    2023年04月08日
    浏览(38)
  • C#与Node JS互相实现DES加密解密

    具体的加密算法可以可自行查询其区别,这里只是抛砖引玉,大部分加密方法基本都能通过改变传入参数来实现。 C#相关类文档: System.Security.Cryptography 命名空间 | Microsoft Learn Node JS相关文档:Crypto | Node.js v16.20.0 Documentation (nodejs.org)   C#加密函数:   控制台输出为   Node J

    2024年02月06日
    浏览(64)
  • DES的加密与解密(C语言实现)——大三密码学实验

    目录 DES的描述 Feistel体制 密钥扩展函数 F函数 总流程  代码 get函数的构建 yihuo函数的构建 fuck函数的构建 left_move函数的构建 exchange函数的构建 erzhuanshi函数的构建 shizhuaner函数的构建 s_box函数的构建 主函数的构建 总函数 运行结果示例 DES: 16 轮, Feistel 型结构 明文长度:

    2024年02月07日
    浏览(49)
  • 【FPGA教程案例40】通信案例10——基于FPGA的简易OFDM系统verilog实现

    FPGA教程目录 MATLAB教程目录 --------------------------------------------------------------------------------------- 目录 1.软件版本 2.OFDM原理 3.OFDM系统的verilog实现

    2024年02月12日
    浏览(56)
  • AES算法基于FPGA的硬件实现(3)AES算法的Verilog实现(完结)

    本设计实现AES加密算法为ecb模式,填充模式未设置,同时支持AES-128/192/256三种密钥长度。 代码完全开源,开源链接在文章末尾。 下图为GitHub仓库中上传的文件第一级结构,第一级为matlab和user,matlab中存储的是在进行列混淆运算时查表所用的coe文件,这些文件用来初始化viv

    2024年01月18日
    浏览(57)
  • 基于FPGA的信号处理算法,FFT法相差检测verilog实现

    基于FPGA的信号处理算法,FFT法相差检测verilog实现 。 1.硬件平台:altera芯片 2.软件平台:Quartusii 13.1 Verilog 3.实现功能:检测两路正弦波的相位差 基于FPGA的信号处理算法,FFT法相差检测verilog实现 引言 在现代通信系统中,信号处理算法在实时性和精度方面面临着巨大的挑战。

    2024年04月16日
    浏览(60)
  • 基于FPGA和Verilog实现的9层电梯控制器仿真设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/85628810 资源下载地址:https://download.csdn.net/download/sheziqiong/85628810 电梯最少可以往返于0—9层楼。 乘客要去的楼层数A可手动输入并显示,按取消键可清除本次输入。 可自动显示电梯运行的楼层数B 当AB时,电梯上升; 当AB时,

    2024年02月02日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包