知识大全 AES算法的JAVA实现
Posted 知
篇首语:实践是知识的母亲,知识是生活的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 AES算法的JAVA实现相关的知识,希望对你有一定的参考价值。
AES算法的JAVA实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
package myLib AES;
/**
* This class is designed to encrypt file using AES
* @author ZhuTao HUST
* Email: cn
* QQ:
* @version
*/
/**
* 可以把它们做成自己的库函数 方便以后使用
*/
public class AESMap
public static char [] key;
public static char [] w;//用来存放扩展后的子密钥;
public static char []Log =
xc
;
public static char[] Log_ =
;
// S盒置换
public static char [] S_BOX =
;
// S盒逆置换
public char [] S_BOX_ =
;
public static char []Rcon=
x x x x
x x x x
x x x x
x x x x
x x x x
x x x x
x x x x
x x x x
x b x x x
x x x x ;
public AESMap()
key = new char[ * ];
w = new char[ * * ];//用来存放扩展后的子密钥;
package myLib AES;
import java io IOException;
import java io FileOutputStream;
import java io FileInputStream;/**
* This class is designed to encrypt file using AES
* @author ZhuTao HUST
* Email: cn
* QQ:
* @version
*/
/**
*
* 把它们做成自己的库函数 方便以后使用
*/
public class AES extends AESMap
/**
* This method is used to encrypt data with AES
* @param OpenPath the path of the file which you want to encrypt
* @param SavePath the path to save the encrypted file
* @param m_Key the encrypt key of user
* @param Nb the length of file blocks( bits)
* @param Nk the length of key
* @return the length of data (bytes)
* @throws IOException
////////////////////////////////////////////////////
功能 AES加密
入口参数 m_Key是用户加密密钥
fp 是要加密的文件指针
fp 是加密后保存密文的文件指针
Nb是加密时明文的分组长度(以 bit为单位)
Nk是密钥的长度(以 bit为单位)
///////////////////////////////////////////////////
*/
public long AES_Encrypt(String OpenPath String SavePath String m_Key int Nb int Nk)
throws IOException
//以二进制读的方式打开要加密的文件
//以二进制写的方式打开保存密文的文件
FileInputStream fp = new FileInputStream(OpenPath);
FileOutputStream fp = new FileOutputStream(SavePath true);
int Length = fp available();//得到要加密的文件的长度
if(Length== )return ;
int leave = Length%( *Nb); //求剩余的字块的字节数
long rounds = Length/( *Nb); //得到整块的加密轮数
if(leave!= )rounds++;
long copy_rounds = rounds;
byte[] state = new byte[ * ]; //作为加密时存放要加密的明文块
byte[] copy = new byte[ * ]; //用来进行短块处理时的缓存区
int Nr=GetRounds(Nb Nk); //得到加密的轮数
KeyExpansion(m_Key Nb Nk Nr); //生成各轮子密钥
if(copy_rounds== &&rounds== )
if(leave== ) fp read(state *Nb);//明文的长度恰好等于分组长度
else
fp read(state leave);//明文的长度小于八个字符
for(int i=leave;i< *Nb;i++)
state[i]= ; //后面用空格补齐
state = Transform(ByteToChar(state) Nb Nr); //加密变换
fp write(state *Nb);//将加密后的密文块写入目标文件
rounds ;
else if(copy_rounds> &&leave!= )//如果明文的长度大于分组长度且字符数不是分组长度的整数倍
//时 需要进行短块处理
fp read(state *Nb);
state = Transform(ByteToChar(state) Nb Nr);//先加密最前面的一块
fp write(state leave);//仅将余数个字符存入文件 而将后部分密文
//与后面的明文合在一起加密
int j= ;
for(int i=leave;i< *Nb;i++)
copy[j++]=state[i];
fp read(copy j leave);
copy = Transform(ByteToChar(copy) Nb Nr);
fp write(copy *Nb);
rounds = ;
while(rounds> )//以下处理的明文是分组的整数倍的情况
fp read(state *Nb);
state = Transform(ByteToChar(state) Nb Nr);
fp write(state *Nb);
rounds ;
fp close();//关闭源文件和目标文件
fp close();
return ((copy_rounds )* *Nb+leave);//返回文件长度
/**
* This method is used to de encrypt cryptograph
* @param OpenPath the path of cryptograph
* @param SavePath the path to save the de encrypted file
* @param m_Key the key to de encrypt file
* @param Nb the length of file blocks( bits)
* @param Nk the length of key
* @return the length of data (bytes)
* @throws IOException
////////////////////////////////////////////////////////
功能 实现AES的解密
入口参数 m_Key是用户加密密钥
fp 是要解密的文件指针
fp 是解密后保存明文的文件指针
Nb是解密时密文的分组长度(以 bit为单位)
Nk是密钥的长度(以 bit为单位)
注意了 解密时和加密时的分组长度要一致
/////////////////////////////////////////////////////////
*/
public long AES_DeEncrypt(String OpenPath String SavePath String m_Key int Nb int Nk)
throws IOException
//以二进制读的方式打开要加密的文件
//以二进制写的方式打开保存密文的文件
FileInputStream fp = new FileInputStream(OpenPath);
FileOutputStream fp = new FileOutputStream(SavePath true);
int Length = fp available();//得到要加密的文件的长度
if(Length== )return ;
int leave=Length%( *Nb);//求剩余的字块的字节数
long rounds=Length/( *Nb);//得到整块的加密轮数
if(leave!= )rounds++;
long copy_rounds=rounds;
byte []state = new byte[ * ]; //解密时存放密文块
int Nr = GetRounds(Nb Nk); //得到解密时循环轮数
KeyExpansion(m_Key Nb Nk Nr); //生成各轮子密钥
byte[] copy = new byte[ ];
if(leave!= )//需要进行短块处理
fp read(copy leave);//先把余数个密文字符保存
fp read(state *Nb);//读取紧接着的一个密文块
state = ReTransform(ByteToChar(state) Nb Nr); //解密
int j= ;
for(int i=leave;i< *Nb;i++) //把解密后的明文和前面的余数个合在一起组成一块
copy[i]=state[j++]; //一起解密
copy = ReTransform(ByteToChar(copy) Nb Nr);
//将解密后的明文写入目标文件
fp write(copy *Nb);
fp write(state j leave);//将余数个明文写入目标文件
rounds = ; //已经完成了两轮解密所以减二
while(rounds> )//对后面是分组长度的整数倍的密文块解密
fp read(state *Nb);//读取密文块
copy = ReTransform(ByteToChar(state) Nb Nr); //解密变换
fp write(copy *Nb);//将解密后的明文写入目标文件
rounds ; //轮数减一
fp close();//关闭源文件和目标文件
fp close();
return ((copy_rounds )* *Nb+leave);//返回文件长度
/**
* This method is used to shift the data in array A
* @param A
//////////////////////////////////////////////////////
功能 将数组A中的四个字节循环左移一个字节
//////////////////////////////////////////////////////
*/
public void RotWord(char[]A)
char temp;
temp=A[ ];
A[ ] = A[ ];
A[ ] = A[ ];
A[ ] = A[ ];
A[ ] = temp;
/**
* This method is used to do S replace durying key expansion
* @param A
////////////////////////////////////////////////
功能 密钥扩展的时候进行S盒替换
入口参数 A是存放四个字节的数组
////////////////////////////////////////////////
*/
public void SubWord(char []A)
for(int i= ;i< ;i++)
A[i]=S_BOX[A[i]];
/**
* This method is used to get rounds of encrypt
* @param Nb the length of file blocks( bits)
* @param Nk the length of key
* @return the rounds of encrypt
//////////////////////////////////////////////////
功能 返回加密的轮数
入口参数 Nb以 bit为单位的待加密明文的长度
Nk是以 bit为单位的初始密钥的长度
返回值 返回加密轮数(Nr)
////////////////////////////////////////////////////
*/
public int GetRounds(int Nb int Nk)
switch(Nb)
case :switch(Nk)
case :return ;
case :return ;
case :return ;
default:return ;
case :switch(Nk)
case :
case :return ;
case :return ;
default:return ;
case :switch(Nk)
case :
case :
case :return ;
default:return ;
default:return ;
/**
* This method is used to build sub keys used in each rounds
* @param m_Key the key of user
* @param Nb the length of file blocks( bits)
* @param Nk the length of key
* @param Nr the rounds of encrypt in each block
////////////////////////////////////////////////////
入口参数 Nb以 bit为单位的待加密明文的长度
Nk是以 bit为单位的初始密钥的长度
Nr是加密的轮数
m_Key是用户的密钥
返回值 扩展后的子密钥存放在数组w中
*/
public void KeyExpansion(String m_Key int Nb int Nk int Nr)
int i= ;
for(;i< ;i++)
for(int j= ;j<Nk;j++)
key[i*Nk+j]=m_Key charAt(i* +j);
i= ;
while(i<Nk)
w[i* ]=key[i* ];
w[i* + ]=key[i* + ];
w[i* + ]=key[i* + ];
w[i* + ]=key[i* + ];
i++;
i=Nk;
while(i<Nb*(Nr+ ))
char []temp = new char[ ];
temp[ ]=w[(i )* + ];temp[ ]=w[(i )* + ];
temp[ ]=w[(i )* + ];temp[ ]=w[(i )* + ];
if((i%Nk)== )
RotWord(temp);
SubWord(temp);
for(int j= ;j< ;j++)
temp[j]^=Rcon[((i )/Nk)* +j];//与Rcon异或
else if(Nk== &&i%Nk== )
SubWord(temp);
w[i* + ] = (char)(w[(i Nk)* + ]^temp[ ]);
w[i* + ] = (char)(w[(i Nk)* + ]^temp[ ]);
w[i* + ] = (char)(w[(i Nk)* + ]^temp[ ]);
w[i* + ] = (char)(w[(i Nk)* + ]^temp[ ]);
i++;
/**
* This method is used to do S replace
* @param state is a array which stored the data block
* @param Nb the length of data block
///////////////////////////////////////////////////
功能 S盒置换
入口参数 Nb为以 bit为单位的明文块的大小
state为明文块
////////////////////////////////////////////////////
*/
public void SubChar(char []state int Nb)
for(int i= ;i< *Nb;i++)
state[i]=S_BOX[state[i]% ];
/**
* @param state is a array which stored the data block
* @param Nb the length of data block
/////////////////////////////////////////////////////
功能 加密对明文块进行移位运算
入口参数 state是明文块
Nb是以 比特为单位的明文块的大小
//////////////////////////////////////////////////////
*/
public void ShiftRows(char []state int Nb)
char[] t = new char [ ];
for( int r= ;r< ;r++)
for(int c= ;c<Nb;c++)t[c]= state[Nb*r+(r+c)%Nb];
for(int c= ;c<Nb;c++)
state[Nb*r+c]=t[c];
/**
* This method is used to mix columns
* @param state is a array which stored the data block
* @param Nb the length of data block
//////////////////////////////////////////////////
功能 加密时对明文块进行列混合变换;
入口参数 state是明文块
Nb是以 比特为单位的明文块的大小
//////////////////////////////////////////////////
*/
public void MixColumns(char[]state int Nb)
int [] t = new int[ ];
for( int c= ;c<Nb;c++)
for(int r= ;r< ;r++)t[r] = state[Nb*r+c];
for(int r= ;r< ;r++)
state[Nb*r+c] = (char)(Ffmul( x t[r])^Ffmul( x t[(r+ )% ])
^t[(r+ )% ]^t[(r+ )% ]);
/**
* This method is used to get the product of A and B
* @param A first number
* @param B second number
* @return the product of A and B
/////////////////////////////////////////////////////////
功能 返回两个域元素A B的积;
/////////////////////////////////////////////////////////
*/
public int Ffmul(int A int B)
//查对数表;
if(A== ||B== )return ;
A = Log[A];
B = Log[B];
A =(A+B)% xff;
//查反对数表;
A = Log_ [A];
return A;
/**
* This method is used to add round key and data
* @param state is the array which contains the data
* @param Nb length of data block( bits)
* @param round the index of current round
///////////////////////////////////////////////////////////////
功能: 轮密钥加变换;
入口参数: state明文块
w为子密钥 Nb为明文块的大小 round为当前加密的轮数;
///////////////////////////////////////////////////////////////
*/
public void AddRoundKey(char[]state int Nb int round)
for(int c= ;c<Nb;c++ round++)
for(int r= ;r< ;r++)
state[r*Nb+c] = (char)(state[r*Nb+c]^w[round* +r]);
/**
* This method is used to do exchang durying the proccess of encryption
* @param state is a array which contains the data to encrypt
* @param Nb the length of data block( bits)
* @param Nr the length of user key
* @return the cryptograph
*/
public byte[] Transform(char[]state int Nb int Nr)
int round= ;
AddRoundKey(state Nb );
for(;round<Nr;round++)
SubChar(state Nb);
ShiftRows(state Nb);
MixColumns(state Nb);
AddRoundKey(state Nb round*Nb);
SubChar(state Nb);
ShiftRows(state Nb);
AddRoundKey(state Nb round*Nb);
return CharToByte(state);
/**
* This method is used to do exchang durying the proccess of de encryption
* @param state is a array which contains the cryptograph to de encrypt
* @param Nb the length of cryptograph block( bits)
* @param Nr the length of user key
* @return the original text
*/
public byte[] ReTransform(char []state int Nb int Nr)
AddRoundKey(state Nb Nr*Nb);
for(int round=Nr ;round>= ;round )
InvShiftRows(state Nb);
InvSubint(state Nb);
AddRoundKey(state Nb round*Nb);
InvMixColumns(state Nb);
InvShiftRows(state Nb);
InvSubint(state Nb);
AddRoundKey(state Nb );
return CharToByte(state);
/**
* This method is used to do S replace durying de encrypt cryptograph
* @param state is a array which contains the cryptograph to de encrypt
* @param Nb the length of cryptograph block( bits)
* @param Nr the length of user key
/////////////////////////////////////////////////////////////
功能 解密时的S盒逆置换
入口参数 state为密文块
Nb为密文块的大小
*/
public void InvSubint(char []state int Nb)
for(int i= ;i< *Nb;i++)
state[i] = S_BOX_ [state[i]% ];
/**
* This method is used to shift rows durying de encyrpt cryptograph
* @param state is a array which contains the cryptograph to de encrypt
* @param Nb the length of cryptograph block( bits)
////////////////////////////////////////////////////////////////
功能 解密的时候的右移位变换
入口参数 state为密文块
Nb为密文块的大小
////////////////////////////////////////////////////////////////
*/
public void InvShiftRows(char[]state int Nb)
char [] t = new char[ ];
for( int r= ;r< ;r++)
for(int c= ;c<Nb;c++)
t[(c+r)%Nb] = state[r*Nb+c];
for(int c= ;c<Nb;c++)
state[r*Nb+c]=t[c];
/**
* This method is used to mix columns durying de encrypt cyyptograph
* @param state is a array which contains the cryptograph to de encrypt
* @param Nb the length of cryptograph block( bits)
//////////////////////////////////////////////////////////////
功能 解密时的列混合变换
入口参数 state为密文块
Nb为密文块的大小
//////////////////////////////////////////////////////////////
*/
public void InvMixColumns(char []state int Nb)
char []t = new char[ ];
for( int c= ;c<Nb;c++)
for(int r= ;r< ;r++)t[r] = state[Nb*r+c];
for(int r= ;r< ;r++)
state[Nb*r+c] = (char)(Ffmul( x e t[r])^Ffmul( x b t[(r+ )% ])
^Ffmul( x d t[(r+ )% ])^Ffmul( x t[(r+ )% ]));
/**
* This method is used to transform a array from byte type to char type
* @param data a byte type array
* @return a char type array
*/
public static char[] ByteToChar(byte[] data)
char []A = new char[data length];
for(int i = ;i<data length;i++)
A[i] = (char)data[i];
return A;
/**
* This method is used to transform a array from char type to byte type
* @param data a char type array
* @return a byte type array
*/
public static byte[]CharToByte(char[]data)
byte[] A = new byte[data length];
for(int i = ;i<data length;i++)
A[i] = (byte)data[i];
return A;
package myLib AES;
import java io IOException;
public class TestAes
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto generated method stub
AES test = new AES();
System out println(test S_BOX length);
//(String OpenPath String SavePath String m_Key int Nb int Nk)
long time = System currentTimeMillis();
try
test AES_Encrypt( G:\\\\ mkv G:\\\\mkv txt );
test AES_DeEncrypt( G:\\\\mkv txt G:\\\\DE mkv );
catch(IOException e)System out println(e);
long time = System currentTimeMillis();
time = time time;
System out println(time);
cha138/Article/program/Java/hx/201311/25654
相关参考
AES对称加密例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 什么是AES AES是一种对
Java实现通用组合算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java实现通用组合算法
最近在面试遇到很多排序算法问题总结一下 定义数组如下 [java] int[]array=newint[]; int[]array=newint[]; 首先是插入排序 [java]
HITS算法Java实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! HITS算法是重要的链接
JAVA垃圾回收算法摘要 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 垃圾收集的算法分析 j
Java通用权限控制算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一种常用的权限控制算法的
JAVA凸包算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 源码一JarvisMarchja
Java扫雷算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 建立一个雷区可以用一个一个的JB
知识大全 Java技术进阶 基于Java的IDEA加密算法探讨
Java技术进阶基于Java的IDEA加密算法探讨 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Hash算法大全(java实现) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hash算法有很