谁能给我一个C语言写的AES CBC加解密源码

Python018

谁能给我一个C语言写的AES CBC加解密源码,第1张

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <openssl/aes.h>

#include "encode.h"

int encode(char *content,int way)

{

AES_KEY aes

unsigned char key[AES_BLOCK_SIZE]

unsigned char iv[AES_BLOCK_SIZE]

unsigned char *encrypt_string

unsigned char *input_string

int len,i

/*Set Input string*/

if((strlen(content)+1)%AES_BLOCK_SIZE==0)

len=strlen(content)+1

else

len=((strlen(content)+1)/AES_BLOCK_SIZE+1)*AES_BLOCK_SIZE

input_string=(unsigned char *)calloc(len,sizeof(unsigned char))

if(input_string==NULL)

return -1

strncpy(input_string,content,strlen(content))

for(i=0i<16++i)

key[i]=i+12

for(i=0i<AES_BLOCK_SIZE++i)

iv[i]=i

if(way==0)

{

if(AES_set_encrypt_key(key,128,&aes)<0)

return -1

}

else

{

if(AES_set_decrypt_key(key,128,&aes)<0)

return -1

}

encrypt_string=(unsigned char *)calloc(len,sizeof(unsigned char))

if(encrypt_string==NULL)

return -1

if(way==0)

AES_cbc_encrypt(input_string,encrypt_string,len,&aes,iv,AES_ENCRYPT)

else

AES_cbc_encrypt(input_string,encrypt_string,len,&aes,iv,AES_DECRYPT)

strcpy(content,(char *)encrypt_string)

free(input_string)

free(encrypt_string)

return 0

}

1 AES加密、解密算法原理和AVR实现

AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。

1.1圈变化

AES每一个圈变换由以下三个层组成:

非线性层——进行Subbyte变换;

线行混合层——进行ShiftRow和MixColumn运算;

密钥加层——进行AddRoundKey运算。

① Subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的S盒进行映射。

Schange:

ldi zh,$01将指针指向S盒的首地址

mov zl,r2;将要查找的数据作为指针低地址

ldtemp,z+;取出这个对应的数据

mov r2,temp;交换数据完成查表

.

.

.

ret

② ShiftRow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据Nb的不同而选择的[3]。

shiftrow:这是一个字节换位的子程序

mov temp,r3因为是4×4

mov r3,r7r2 r6 r10 r14 r2 r6 r10 r14

mov r7,r11r3 r7 r11 r15---r7 r11 r15 r3

mov r11,r15r4 r8 r12 r17 r12 r17 r4 r8

mov r15,tempr5 r9 r13 r18 r18 r5 r9 r13

mov temp,r4

mov temp1,r8

mov r4,r12

mov r8,r17

mov r12,temp

mov r17,temp1

mov temp,r18

mov r18,r13

mov r13,r9

mov r9,r5

mov r5,temp

ret

③ 在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式a(x)与固定多项式c(x)相乘的结果。b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即

b(x)=c(x)·a(x)(mod x4+1)

对于这个运算

b0=02。a0+03。a1+a2+a3

令xtime(a0)=02。a0

其中,符号“。”表示模一个八次不可约多项式的同余乘法[3]。

mov temp,a0这是一个mixcolimn子程序

rcall xtime调用xtime程序

mov a0,temp

mov temp,a1

rcall xtime

eor a0,a1

eor a0,temp

eor a0,a2

eor a0,a3完成b(x)的计算

.

.

.

xtime:这是一个子程序

ldi temp1,$1b

lsl temp

brcs next1如果最高位是1,则转移

next: ret否则什么也不变化

next1:eor temp,temp1

rjmp next

对于逆变化,其矩阵C要改变成相应的D,即b(x)=d(x)*a(x)。

④ 密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。

⑤ 根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。

1.2轮变化

对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。

1.3密钥扩展

AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。它涉及如下三个模块:

① 位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];

② S盒变换(subword)——对一个4字节进行S盒代替;

③ 变换Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。这里的x是(02),如

Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……

扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[[i]]=W[[i-1]]�W[[i- Nk]]。但是若i为Nk的倍数,则W[i]=W[i-Nk]�Subword(Rotword(W[[i-1]]))�Rcon[i/Nk]。

程序执行的时候,主要调用以上几个子程序,具体实现如下:

Keyexpansion:

rcall rotwoed

rcall subword

rcall Rcon

.

.

.

2 AES加密、解密算法的优化

由以上算法的流程中可以清楚地看到,整个算法中程序耗时最多的就是圈变化部分,因此对于算法的优化也就在此;而圈变化部分可以优化的也就是列变化。因为列变化是一个模乘同余规则。由于AES加密和解密是不对称的,如果不对其进行优化,会使算法的解密速度远远大于加密的速度[1]。

① 加密运算。对列变换(Mixcolumn)可以通过调用xtime子程序进行优化。

另一种有效的优化方法就是离线构造一个表格,即列变化表格。这样只要通过查表的方式就可以提高加密速度。

② 解密算法的优化。由于解密的列变换的系数分别是09、0E、0B和0D。在AVR单片机上实现以上的乘法显然是需要很多的时间,从而导致了解密的性能降低。

优化方法一:对列变化进行分解使倍乘次数降低。

仔细研究解密矩阵的系数,不难发现解密矩阵和加密矩阵有着一定的联系,即解密矩阵等于加密矩阵和一个矩阵的相乘。通过这样的联系,就可以对算法进行优化:

这样一来,只用几个简单的“异或”就可以实现列变化,使倍乘的次数降低,提高解密的速度。

优化方法二:构造表格。

同加密构造方法一样,可以构造四个表格T[ea]=e×aT[9a]=9×aT[9a]=9×aT[ba]=b×a。这样一来,也只需要进行查表和简单的异或就可以完成解密的任务。虽然这种方法将增加额外的开销,但是它却是一种有效的方法。

3 AES加密与解密的实验仿真

根据以上实验步骤和优化方法得出表2、3所列实验结果。

设主密钥为:000102030405060708090a0b0c0d0e0f(128bit)。

加密明文:00112233445566778899AABBCCDDEEFF。

密文:69C4E0D86A7B0430D8CDB78070B4C55A。

解密密文:69C4E0D86A7B0430D8CDB78070B4C55A。

明文:00112233445566778899AABBCCDDEEFF。

总之,AES密码是一个非对称密码体制,它的解密要比加密复杂和费时。解密优化算法没有增加存储空间的基础上,以列变化为基础进行处理,程序比原始的要小,而且节约了时间。解密优化方法速度最快,效率最高,但要增加系统的存储空间,因此它的程序也是最大的一个

流程图省略 朋友参考吧