导航:首页 > 文档加密 > aes加密matlab程序

aes加密matlab程序

发布时间:2022-05-16 00:44:56

⑴ matlab 提高函数速度

temp = bin2dec(reshape(data, 16, 8));

这样试试看

不是所有for循环都可以去掉

难道我的回答第一句代码是隐形的嘛?。。。就是让你用这句替换掉for循环啊 当然这个结果是列向量,可能需要转置一下什么的

⑵ 一个matlab程序加密后只能通过密码或者生成密钥来运行程序如何实现

n=4;%%%设定允许输入密码的次数即可。

⑶ 求一个加密解密算法实作(C++或matlab)


welcome to guangzhou hongmeng !

import java.io.*;

public class suanfa1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
File file=new File("1.txt");
System.out.println(file.length()/12);
int x[]=new int[3];
try{
BufferedReader in=new BufferedReader(new FileReader(file));
char xxx[][]=new char[1000][4];
int i=0;
while(in.read(xxx[i])==4)
{
i++;
}
int j=i,xy=0;
suanfa2 xx[]=new suanfa2[j/3];
for(i=0;i<j;i+=3,xy++)
{
for(int k=i,xz=0;k<i+3;k++,xz++)
x[xz]=Integer.parseInt(new String(xxx[k]));
xx[xy]=new suanfa2(x[0],x[1],x[2]);
//System.out.println("实际位置:"+xx[xy].wei1);
System.out.print(xx[xy].zifu1);
}
suanfa1.sort1(xx);
for(i=0;i<xy;i++)
System.out.print(xx[i].zifu1);

}
catch(IOException e){}

}

public static void sort1(suanfa2 xyz[])
{
int length=xyz.length;
for(int x=1;x<length;x++)
{
int k=x-1;
for(int i=x;i<length;i++)
if(xyz[i].wei1<xyz[k].wei1)
{
suanfa2 xx;
xx=xyz[i];
xyz[i]=xyz[k];
xyz[k]=xx;
}
}
}

}

public class suanfa2 {
int suanzi;//加密算子
int wei;//表示这个字符在整个字符串中的位置(加密),
int zifu;//表示加密过的字符(ASCII码值)。
char zifu1;//被加密的字符
int wei1;//实际的位置

public suanfa2(int x,int y,int z)
{
// TODO 自动生成构造函数存根
this.suanzi=x;
this.wei=y;
this.zifu=z;
wei1=this.getSJwei();
zifu1=this.getZifu();
}
int getSJwei()
{
return wei-suanzi;
}
char getZifu()
{
return (char)(zifu+suanzi);
}

}

1.txt
48-016--019---01600130048-01800120051006800680051

⑷ MATLAB Compiler Runtime怎么用

使用MATLAB Compiler

(一)准备

什么是MATLAB Compiler?MATLAB Compiler能够将你的matlab程序转换为自包含(self-contained)的应用程序和组件,这样你就可以将程序发放给你的终端用户,而且终端用户无需安装matlab就可以运行这些程序。MATLAB Compiler能够生成的应用或者组件包括下面这几类:

1、独立的应用程序
2、C和C++共享库(动态链接库,在Windows平台上是DLL,在Linux平台下是.so文件)
3、Excel插件
4、COM和.NET对象

本文中我们只看matlab是如何生成独立的应用程序的。其他组件生成方式可以参考matlab的帮助文档。注意:在你使用MATLAB Compiler和阅读相关说明文档之前,要求你一定要已经安装了MATLAB Compiler,也就是安装的时候必须要选中MATLAB Compiler复选框。在我使用的matlab 2005a上,安装的是MATLAB Compiler version 4。

假定你已经安装好了MATLAB Compiler。下面我们看一下与MATLAB Compiler相关的两个重要概念MCR和CTF。

MCR的全称是MATLAB Component Runtime,它是一组独立的共享库,通过它能够执行在MATLAB中编写的M文件。MCR支持MATLAB语言的所有功能。

CTF的全称是Component Technology File,这是一种归档技术,通过它,MATLAB将可部署文件包装起来。需要注意的是,位于CTF归档文件中的所有M文件都采用了AES(Advanced Encryption Standard)进行加密,AES的对成密钥则通过1024位的RSA密钥保护。除此之外,CTF还对归档文件进行了压缩。显然,通过这种方式,可以只将可知行的应用程序或者组件发布给终端用户,而保证源代码不被泄漏。

MATLAB Compiler的构建过程分为下面五步:
1、分析依赖关系
2、代码生成
3、创建归档文件(archive)
4、编译
5、链接

事实上,只有前面三步是针对M文件的,第四步和第五步和通常编译C或者C++程序毫无二致。因此,你可能会想到,这不就能够混合使用MATLAB和C以及C++了么?是的。MATLAB Compiler可以让你很简单很容易地做到这一点,不过这并不是本文要讲述的内容。

既然MATLAB Compiler是将M文件中的代码编译成C/C++接口,那么应该使用什么样的C/C++编译器呢?MATLAB Compiler支持的ANSI C和C++编译器有这样一些:
1、Lcc C version 2.4.1,这个是MATLAB Compiler自带的编译器,也是默认的编译器,但是它只能支持C代码;
2、Borland C++ version 5.5,5.6,以及5.5免费版
3、Microsoft Visual C/C++(MSVC)version 6.0和7.1
4、对于UNIX系统,支持的编译器是gcc和g++

(二)开始

要使用MATLAB Compiler,在MATLAB的command窗口或者DOS命令窗口输入mcc即可。比如,我们在MATLAB的command窗口下输入(本文中以加色的字符表示交互信息):

>> mcc

将会出现:

Error: No source files were specified (-? for help).
??? Error executing mcc, return status = 1.

这里的提示表明一定要给mcc指定源代码文件,也即使已经写好的M文件。你也可以输入:

>> mcc -?

或者:

>> help mcc

来获取mcc的帮助信息。当然,详尽的帮助文档应该参考MATLAB Help。

这里以我在上一篇日志中给出的write_dicom.m文件为例进行说明:
如果要生成独立的应用程序,那么只需要在MATLAB的command窗口或者DOS命令窗口输入:

>> mcc -m write_dicom

即可。如果要生成动态链接库,那么只需要将选项改为:

>> mcc -l write_dicom

即可。

注意,必须要确保write_dicom.m在MATLAB的当前工作目录下。否则会出错。
假设我现在是想生成独立的应用程序,那么在执行了:

>> mcc -m write_dicom

之后(在我的机器上这个过程可能需要一分钟左右,有点慢)。在当前工作目录下会多出这样一些文件:

write_dicom_main.c
write_dicom_mcc_component_data.c
write_dicom.ctf
write_dicom.exe

其中,write_dicom_main.c中是包裹函数,write_dicom_mcc_component_data.c中包含了解压write_dicom.ctf的数据(如密钥等)。而write_dicom.exe则是我们可以直接运行的应用程序,很遗憾,这里我们只能通过DOS命令窗口对它进行调用,不过这对于我们而言并没有什么,不是么?接下来,我们打开DOS命令窗口,切换到MATLAB的工作目录下面(也就是这里生成出来的几个文件所在的目录)。然后在命令行下输入:

C:\matlab2006\work>write_dicom ya.jpg ya.dcm
Extracting CTF archive. This may take a few seconds, depending on the
size of your application. Please wait...
...CTF archive extraction complete.
C:\matlab2006\work>

可以看到,write_dicom先从write_dicom.ctf抽取出相关的文件,注意到抽取完成之后在当前目录下会多出一个write_dicom_mcr\文件夹来。在这个文件夹中,不仅包含了原来的程序文件write_dicom.m,还包括了toolbox\下与DICOM读写等有关的M文件,但是这些文件都已经被加密了,直接用MATLAB Editor是看不到文件的真正内容的,出来的是一堆毫无意义的乱码。

上面的程序执行起来同样比较慢,不过,只要它能正确执行,谁在乎这点时间呢?况且我的机器配置并不好^_^

可以看到,此时,ya.dcm已经生成了,就在C:\matlab2006\work\目录下,我们同样可以用CVIEW.exe等等DICOM工具查看图像或者查看DICOM元数据(metadata)。

⑸ 基于AES的文件加密管理系统的实现。要求具有良好的交互界面!实现对文件(txt,word,excel等文件)的加密。

#ifndef uint8
#define uint8 unsigned char
#endif

uint8 sbox[256]={
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
};

uint8 invsbox[256] =
{
0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
};

class Rijndeal
{
public:
char text[1000],text1[1000];
uint8 state[16];
uint8 key[16];
uint8 roundkey[11][16];

void add(uint8 s[16],uint8 k[16]);
void subbyte(uint8 s[16]);
void shiftrows(uint8 s[16]);
void mixcolumns(uint8 s[16]);
void keysehele();
void rijndeal();//加密
void jiami();
void invsubbyte(uint8 s[16]);
void invshiftrows(uint8 s[16]);
void invmixcolumns(uint8 s[16]);
void invrijndeal();
void jiemi();
};

void Rijndeal::add(uint8 s[16],uint8 k[16])
{
for(uint8 i=0;i<16;i++)
s[i]^=k[i];
}

void Rijndeal::subbyte(uint8 s[16])
{
for(int i=0;i<16;i++)
s[i]=sbox[s[i]];
}

void Rijndeal::shiftrows(uint8 s[16])
{
int i,t=s[4];
for(i=4;i<7;i++)s[i]=s[i+1];
s[i++]=t;
t=s[i];s[i]=s[i+2];s[(i++)+2]=t;
t=s[i];s[i]=s[i+2];s[i+2]=t;
t=s[15];
for(i=15;i>12;i--)s[i]=s[i-1];
s[i]=t;
}

void Rijndeal::mixcolumns(uint8 s[16])
{
int i;
uint8 mix[4][4]={2,3,1,1,1,2,3,1,1,1,2,3,3,1,1,2};
uint8 ss[16];
for(i=0;i<16;i++)ss[i]=s[i];
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
{
int f[4];
for(int l=0;l<4;l++)
{
f[l]=ss[i+4*l];
if(mix[j][l]==2)f[l]<<=1;
if(mix[j][l]==3)f[l]^=f[l]<<1;
if(f[l]&0x100)f[l]^=0x11b;//溢出时要异或0x11b
}
s[4*j+i]=((uint8)f[0])^((uint8)f[1])^((uint8)f[2])^((uint8)f[3]);
}
}

void Rijndeal::keysehele()
{
uint8 bit[10]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80,0x1b,0x36};
int i;
for(i=0;i<16;i++)roundkey[0][i]=key[i];
for(i=1;i<=10;i++)
{
for(int j=0;j<4;j++)
{
uint8 f[4];
if(j==0)
{
for(int l=0;l<4;l++)
f[l]=roundkey[i-1][3+l*4];
uint8 t=f[0];
for(l=0;l<3;l++)f[l]=f[l+1];
f[l]=t;
for(l=0;l<4;l++)f[l]=sbox[f[l]];
roundkey[i][0]=roundkey[i-1][0]^f[0]^bit[i-1];
for(l=1;l<4;l++)roundkey[i][l*4]=roundkey[i-1][l*4]^f[l];
}
else for(int l=0;l<4;l++)
roundkey[i][j+l*4]=roundkey[i][j+l*4-1]^roundkey[i-1][j+l*4];
}
}
}

void Rijndeal::rijndeal()//组加密
{
keysehele();
add(state,roundkey[0]);
for(int i=1;i<10;i++)
{
subbyte(state);
shiftrows(state);
mixcolumns(state);
add(state,roundkey[i]);
}
subbyte(state);
shiftrows(state);
add(state,roundkey[i]);
}

void Rijndeal::jiami()
{
int l=0,k=0,i;
for(i=0;i<16&&text[i]!='\0';i++)key[i]=text[i];//把明文的前16个当做初始密钥
if(i<16)for(;i<16;i++)key[i]=' ';//不够16位补空隔
while(text[l]!='\0')
{
for(i=0;i<16&&text[l]!='\0';i++,l++)state[i]=text[l];//分组
if(i<16)for(;i<16;i++)state[i]=' ';//分组不够16位,按空隔处理
rijndeal();
for(i=0;i<16;i++)
text1[k++]=state[i];
}
text1[k]=NULL;
cout<<"\n输出加密后的数据:\n";
cout<<"\N";
}

void Rijndeal::invsubbyte(uint8 s[16])
{
for(int i=0;i<16;i++)
s[i]=invsbox[s[i]];
}

void Rijndeal::invshiftrows(uint8 s[16])
{
int i,t;
t=s[7];
for(i=7;i>4;i--)s[i]=s[i-1];
s[4]=t;
t=s[8];s[8]=s[10];s[10]=t;
t=s[9];s[9]=s[11];s[11]=t;
t=s[12];
for(i=12;i<15;i++)s[i]=s[i+1];
s[15]=t;
}

void Rijndeal::invmixcolumns(uint8 s[16])
{
int i;
uint8 invmix[4][4]={14,11,13,9,9,14,11,13,13,9,14,11,11,13,9,14};
uint8 ss[16];
for(i=0;i<16;i++)ss[i]=s[i];
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
{
int f[4];
for(uint8 l=0;l<4;l++)
{
f[l]=ss[i+4*l];
int a,b,c;
a=(uint8)f[l]<<1;
if(a&0x100)a^=0x11b;
b=a<<1;
if(b&0x100)b^=0x11b;
c=b<<1;
if(c&0x100)c^=0x11b;
if(invmix[j][l]==9)
f[l]=f[l]^c;
else if(invmix[j][l]==11)
f[l]=f[l]^a^c;
else if(invmix[j][l]==13)
f[l]=f[l]^b^c;
else if(invmix[j][l]==14)
f[l]=a^b^c;
}
s[4*j+i]=f[0]^f[1]^f[2]^f[3];
}
}

void Rijndeal::invrijndeal()//组解密
{
add(state,roundkey[10]);
invshiftrows(state);
invsubbyte(state);
for(int i=9;i>0;i--)
{
add(state,roundkey[i]);
invmixcolumns(state);
invshiftrows(state);
invsubbyte(state);
}
add(state,roundkey[0]);
}

void Rijndeal::jiemi()
{
int l=0,k=0,i;
while(text1[l]!=NULL)
{
for(i=0;i<16;i++,l++)
state[i]=text1[l];
invrijndeal();
for(i=0;i<16;i++)
text[k++]=state[i];
}
text[k]='\0';
while(text[k-1]==' ')text[(k--)-1]='\0';
cout<<"\n解密后得明文为:\n"<<"\N";
}

int main()
{
Rijndeal C;
gets(C.text);
C.jiami();
C.jiemi();
return 0;
}
就不发GUI的了 GUI的麻烦

⑹ 各位大侠,急求AES图像加密的MATLAB代码!!!

首先说定义的函数可能在调用时出现问题,原因是函数的输入部分plot在其中并没有使用,再者输出参数应包括m和n,因此函数定义部分应该改为function
[hist,
rgbt,m,n]
=
getimagehists(imagename)。
在执行完hist
=
hist
/
(m*n),执行如下语句完成数据保存
save
hists.mat
hist
接着可以执行
clear
all
并执行
load
hists.mat
hist
及whos
以验证数据存储是否成功

⑺ 懂MATLAB和AES加密算法的高手来帮我!怎么用MATLAB语言编程AES加密算法

加密过程为:C=Ek3(Dk2(Ek1(P)))

3DES解密过程为:P=Dk1((EK2(Dk3(C)))

具体的加/解密过程如图2所示。K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。

⑻ 初学者,求高手给一个完整的AES加密解密算法的程序(C/C++) 希望能满足如下要求

/*128bits密钥长度及分组长度AES加解密代码
*作者:Jeffrey.zhu
*/

⑼ 求AES加解/密码密软件程序!!!

有界面,我这里有个,但是是c#语言的,你以为如何?
下面是c版本的
AES加密算法源代码
//AES.h

#define decrypt TRUE
#define encrypt FALSE
#define TYPE BOOL

typedef struct _AES{
int Nb;
int Nr;
int Nk;
unsigned long *Word;
unsigned long *State;
}AES;

/*
加密数据
byte *input 明文
byte *inSize 明文长
byte *out 密文存放的地方
byte *key 密钥key
byte *keySize 密钥长
*/
void Cipher(
unsigned char* input,
int inSize,
unsigned char* out,
unsigned char* key,
int keySize);

/*
解密数据
byte *input 密文
int *inSize 密文长
byte *out 明文存放的地方
byte *key 密钥key
int *keySize 密钥长
*/
void InvCipher(
unsigned char* input,
int inSize,
unsigned char* out,
unsigned char* key,
int keySize);

/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
unsigned long 属性(标实类型)
返回AES结构指针
*/
AES *InitAES(AES *aes,
int inSize,
unsigned char* key,
int keySize, TYPE type);

/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
返回AES结构指针
*/
AES *InitAES(
int inSize,
unsigned char* key,
int keySize, BOOL );

/*
加密时进行Nr轮运算
AES * aes 运行时参数
*/
void CipherLoop(
AES *aes);
/*
解密时进行Nr轮逆运算
AES * aes 运行时参数
*/
void InvCipherLoop(
AES *aes);

/*
释放AES结构和State和密钥库word
*/
void freeAES(
AES *aes);

//AES.cpp

#include "stdafx.h"
#include
#include
#include "AES.h"
unsigned char* SubWord(unsigned char* word);
unsigned long* keyExpansion(unsigned char* key, int Nk, int Nr,int);
/*
加密数据
byte *input 明文
byte *inSize 明文长
byte *out 密文存放的地方
byte *key 密钥key
byte *keySize 密钥长
*/
void Cipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)
{
AES aes ;
InitAES(&aes,inSize,key,keySize,encrypt);

memcpy(aes.State,input,inSize);
CipherLoop(&aes);
memcpy(out,aes.State,inSize);

}

/*
解密数据
byte *input 密文
int *inSize 密文长
byte *out 明文存放的地方
byte *key 密钥key
int *keySize 密钥长
*/
void InvCipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)
{
AES aes;
InitAES(&aes,inSize,key,keySize,decrypt);
memcpy(aes.State,input,inSize);
InvCipherLoop(&aes);
memcpy(aes.State,out,inSize);
}

/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
返回AES结构指针
*/
AES *InitAES(AES *aes,int inSize, unsigned char *key, int keySize, TYPE type)
{
int Nb = inSize >>2,
Nk = keySize >>2,
Nr = Nb < Nk ? Nk:Nb+6;
aes->Nb = Nb;
aes->Nk = Nk;
aes->Nr = Nr;
aes->Word = keyExpansion(key,Nb,Nr,Nk);

aes->State = new unsigned long[Nb+3];
if(type)
aes->State += 3;
return aes;
}

/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
返回AES结构指针
*/
AES *InitAES(int inSize, unsigned char* key, int keySize,unsigned long type)
{
return InitAES(new AES(),inSize,key,keySize,type);
}
/*
*/
void CipherLoop(AES *aes)
{
unsigned char temp[4];
unsigned long *word8 = aes->Word,
*State = aes->State;

int Nb = aes->Nb,
Nr = aes->Nr;

int r;
for (r = 0; r < Nb; ++r)
{
State[r] ^= word8[r];
}
for (int round =1; round {
word8 += Nb;
/*
假设Nb=4;
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | s7 |
---------------------
| s8 | s9 | sa | sb |
---------------------
| sc | sd | se | sf |
---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------
*/
memcpy(State+Nb,State,12);
/*
Nb=4;
---------------------
| s0 | | | |
---------------------
| s4 | s5 | | |
---------------------
| s8 | s9 | sa | |
---------------------
| sc | sd | se | sf |
---------------------
| | s1 | s2 | s3 |
---------------------
| | | s6 | s7 |
---------------------
| | | | sb |
---------------------
*/
for(r =0; r {
/*
temp = {Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};
*/
temp[0] = Sbox[*((unsigned char*)State)];
temp[1] = Sbox[*((unsigned char*)(State+1)+1)];
temp[2] = Sbox[*((unsigned char*)(State+2)+2)];
temp[3] = Sbox[*((unsigned char*)(State+3)+3)];

*((unsigned char*)State) = Log_02[temp[0]] ^ Log_03[temp[1]] ^ temp[2] ^ temp[3];
*((unsigned char*)State+1) = Log_02[temp[1]] ^ Log_03[temp[2]] ^ temp[3] ^ temp[0];
*((unsigned char*)State+2) = Log_02[temp[2]] ^ Log_03[temp[3]] ^ temp[0] ^ temp[1];
*((unsigned char*)State+3) = Log_02[temp[3]] ^ Log_03[temp[0]] ^ temp[1] ^ temp[2];

*State ^= word8[r];
State++;
}
State -= Nb;
}

memcpy(State+Nb,State,12);

word8 += Nb;
for(r =0; r {
*((unsigned char*)State) = Sbox[*(unsigned char*)State];
*((unsigned char*)State+1) = Sbox[*((unsigned char*)(State+1)+1)];
*((unsigned char*)State+2) = Sbox[*((unsigned char*)(State+2)+2)];
*((unsigned char*)State+3) = Sbox[*((unsigned char*)(State+3)+3)];

*State ^= word8[r];
State++;
}
}
/*
解密时进行Nr轮逆运算
AES * aes 运行时参数
*/
void InvCipherLoop(AES *aes)
{
unsigned long *Word = aes->Word,
*State = aes->State;

int Nb = aes->Nb,
Nr = aes->Nr;

unsigned char temp[4];

int r =0;
Word += Nb*Nr;
for (r = 0; r < Nb; ++r)
{
State[r] ^= Word[r];
}

State -= 3;

for (int round = Nr-1; round > 0; --round)
{
/*
假设Nb=4;
---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | s7 |
---------------------
| s8 | s9 | sa | sb |
---------------------
| sc | sd | se | sf |
---------------------
*/
memcpy(State,State+Nb,12);
/*
Nb=4;
---------------------
| | | | s7 |
---------------------
| | | sa | sb |
---------------------
| | sd | se | sf |
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | |
---------------------
| s8 | s9 | | |
---------------------
| sc | | | |
---------------------
*/

Word -= Nb;
State += Nb+2;

for(r = Nb-1; r >= 0; r--)
{
/*
temp = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};
*/
temp[0] = iSbox[*(byte*)State];
temp[1] = iSbox[*((byte*)(State-1)+1)];
temp[2] = iSbox[*((byte*)(State-2)+2)];
temp[3] = iSbox[*((byte*)(State-3)+3)];

*(unsigned long*)temp ^= Word[r];

*(unsigned char*)State = Log_0e[temp[0]] ^ Log_0b[temp[1]] ^ Log_0d[temp[2]] ^ Log_09[temp[3]];
*((unsigned char*)State+1) = Log_0e[temp[1]] ^ Log_0b[temp[2]] ^ Log_0d[temp[3]] ^ Log_09[temp[0]];
*((unsigned char*)State+2) = Log_0e[temp[2]] ^ Log_0b[temp[3]] ^ Log_0d[temp[0]] ^ Log_09[temp[1]];
*((unsigned char*)State+3) = Log_0e[temp[3]] ^ Log_0b[temp[0]] ^ Log_0d[temp[1]] ^ Log_09[temp[2]];

State --;
}
State -= 2;
}

Word -= Nb;
memcpy(State,State+Nb,12);

State += Nb+2;
for(r = Nb-1; r >= 0; r--)
{

*(unsigned char*)State = iSbox[*(unsigned char*)State];
*((unsigned char*)State+1) = iSbox[*((unsigned char*)(State-1)+1)];
*((unsigned char*)State+2) = iSbox[*((unsigned char*)(State-2)+2)];
*((unsigned char*)State+3) = iSbox[*((unsigned char*)(State-3)+3)];

*State ^= Word[r];
State --;
}
}
/*
*--------------------------------------------
*|k0|k1|k2|k3|k4|k5|k6|k7|k8|k9|.......|Nk*4|
*--------------------------------------------
*Nr轮密钥库
*每个密钥列长度为Nb
*---------------------
*| k0 | k1 | k2 | k3 |
*---------------------
*| k4 | k5 | k6 | k7 |
*---------------------
*| k8 | k9 | ka | kb |
*---------------------
*| kc | kd | ke | kf |
*---------------------
*/
unsigned long* keyExpansion(byte* key, int Nb, int Nr, int Nk)
{
unsigned long *w =new unsigned long[Nb * (Nr+1)]; // 4 columns of bytes corresponds to a word

memcpy(w,key,Nk<<2);
unsigned long temp;

for (int c = Nk; c < Nb * (Nr+1); ++c)
{
//把上一轮的最后一行放入temp
temp = w[c-1];
//判断是不是每一轮密钥的第一行
if (c % Nk == 0)
{
//左旋8位
temp = (temp<<8)|(temp>>24);
//查Sbox表
SubWord((byte*)&temp);
temp ^= Rcon[c/Nk];
}
else if ( Nk > 6 && (c % Nk == 4) )
{
SubWord((byte*)&temp);
}
//w[c-Nk] 为上一轮密钥的第一行
w[c] = w[c-Nk] ^ temp;
}
return w;
}

unsigned char* SubWord(unsigned char* word)
{
word[0] = Sbox[ word[0] ];
word[1] = Sbox[ word[1] ];
word[2] = Sbox[ word[2] ];
word[3] = Sbox[ word[3] ];
return word;
}
/*
释放AES结构和State和密钥库word
*/
void freeAES(AES *aes)
{
// for(int i=0;iNb;i++)
// {
// printf("%d\n",i);
// free(aes->State[i]);
// free(aes->Word[i]);
// }
// printf("sdffd");
}

⑽ 如何使用aes加密数据

AES是对称密钥算法,在它进行计算时使用的也是分组密码体制。先对明文分组,然后利用密钥进行加密迭代。

具体的算法细节可以看密码学的书。

阅读全文

与aes加密matlab程序相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:769
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:844
安卓怎么下载60秒生存 浏览:803
外向式文件夹 浏览:240
dospdf 浏览:431
怎么修改腾讯云服务器ip 浏览:392
pdftoeps 浏览:496
为什么鸿蒙那么像安卓 浏览:736
安卓手机怎么拍自媒体视频 浏览:186
单片机各个中断的初始化 浏览:724
python怎么集合元素 浏览:481
python逐条解读 浏览:833
基于单片机的湿度控制 浏览:499
ios如何使用安卓的帐号 浏览:883
程序员公园采访 浏览:812
程序员实战教程要多长时间 浏览:979
企业数据加密技巧 浏览:135
租云服务器开发 浏览:814
程序员告白妈妈不同意 浏览:337
攻城掠地怎么查看服务器 浏览:601