我最近在学习加密算法。 我上周学习了RSA公钥密码算法。 仪式很简单。 本想用FPGA实现RSA算法,但自己实际编码后发现,FPGA本身附带的加法器、乘法器.为32位。 问题是,使用1024位加密算法时,直接运算FPGA是不能吃的,也不能合并。 先从简单的地方开始吧。 对称加密算法AES。 该算法的加密过程比RSA复杂得多,但他不能使用较高级别的加法器、乘法器,容易通过fpga实现,所以进行了学习。
1.AES的起源
1997年9月,NIST招募了AES方案来代替DES。
1999年s月,以下5个方案成为最终候选方案:MARS、RCS,
RiJndael,Serpent,Twofish。
2000年10月,比利时的joan Daemen和Vincent
Rijmen提出的算法最终赢了。 Rijndaei读作Rain doll
2.AES的设计原则
可以抵抗所有已知的攻击; 容易在各种平台上实现,速度快; 设计很简单。
Rijndael是组密码算法,组长和密钥长度是相互独立的,可以改变。
3 .算法流程如下
AES加密过程包括四个操作:字节替换(SubBytes )、行移位(ShiftRows )、列模糊化(round keys )和循环密钥添加。 解码过程是各自对应的逆操作。 由于各步骤的操作是可逆的,因此如果按照相反的顺序进行解码,则能够恢复明文。 解密过程中各回合的密钥分别由初始密钥扩展。 算法中的16字节明文、密文和循环密钥都用4x4矩阵表示。
波士顿大学的Howard Straubing制作了这样的视频,展示了AES加密算法的演示,但很好。
下面分别列出了加密进程的上述五种操作
这里是演示视频(如果下面的视频无效,请单击此处打开) )。
笔者首先从matlab实现AES算法入手,然后转入Verilog硬件描述语言,利用FPGA实现数据流加密。 关于matlab,笔者有些想吐槽的地方。 matlab计算工具本身也有错误。 我在调试AES算法时,找了很久才发现不是算法的问题,而是工具的问题。 matlab的规则中,有不熟悉就会得到错误的计算结果的一面。 而是在matab的命令输入窗口中输入x=uint8(x 5; 结果是255。 一般的理解是,x是8位无符号整数,最高表示255。 但是,你加5就一定会溢出来。 但是,matlab不会在最大值的时候溢出。 他不直接进行加法运算,而是输出最大值。
目前,只是实现了AES加密的算法,还没有实现AES解密的算法。 从这周开始实现。 写代码3天,调试3天,matlab被打孔了。 我写的都是正确的。 贴上matlab的加密代码(私钥128bit ) (部分) :
清除全部; clc; info='hello i am koala '; %明文[x,y]=size(info );
forI=1:16info(I )=uint8) info(I ); end clear i; clear x y; for
I=1:16k(I )=uint8) I64; %私钥enddisp('key=' ); str=sprintf('%s ',k );
DISP(str; %明文组织数组for i=1:4 for j=1:4
m(j,I )=uint8) info((I-1 ) *4 j ); endendstr=sprintf(mingWen:
%s ',m; DISP(str; DISP(m; %私钥组织数组for i=1:4 for j=1:4
key(j,I )=k ) (I-1 ) *4 j ); end end [keyexp1,rcon]=keyexp(key ); %运算开始
s=addk(m,key ); forI=1:10s=Sbox(s; s=byterot(s; if(I(=10 ) ) ) )。
s=mixcol(s; ends=addk(s,keyexp1) :i*4 1:i*4 4); 结束
str=sprintf(miWen: ); DISP(str; DISP(s; str=sprintf(x ),s );
DISP(str;
执行结果如下所示。
解密的过程与加密略有不同,都是一些逆运算。 (加密结束后,解密会顺利进行。 我花了两个小时写了解密程序。
笔者的matlab解密matlab运算展示: