知识大全 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对称加密例子

AES对称加密例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  什么是AES  AES是一种对

知识大全 Java实现通用组合算法

Java实现通用组合算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java实现通用组合算法

知识大全 常见排序算法的java实现

  最近在面试遇到很多排序算法问题总结一下  定义数组如下  [java]  int[]array=newint[];  int[]array=newint[];  首先是插入排序  [java]  

知识大全 HITS算法Java实现

HITS算法Java实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  HITS算法是重要的链接

知识大全 JAVA垃圾回收算法摘要

JAVA垃圾回收算法摘要  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  垃圾收集的算法分析  j

知识大全 Java通用权限控制算法

Java通用权限控制算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一种常用的权限控制算法的

知识大全 JAVA凸包算法

JAVA凸包算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  源码一JarvisMarchja

知识大全 Java扫雷算法

Java扫雷算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  建立一个雷区可以用一个一个的JB

知识大全 Java技术进阶 基于Java的IDEA加密算法探讨

Java技术进阶基于Java的IDEA加密算法探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Hash算法大全(java实现)

Hash算法大全(java实现)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hash算法有很