四.Rijndael算法实现,java版本

public class Rijndael_Algorithms {
 
 private byte[] key;
 
 /**-------------------- Rijndael round subkeys ---------------------*/
 private byte roundKeys[][][] = new byte[11][4][4];
 
 /**
  * -------------------------------------------------------------------
  *  Rijndael key schedule function.  Takes 16-byte key and creates
  *  all Rijndael's internal subkeys ready for encryption.
  * -----------------------------------------------------------------
  */
 public Rijndael_Algorithms(byte[] key) {
  this.key = key;
  RijndaelKeySchedule();
 }
 
 public void RijndaelKeySchedule()
 {
  byte roundConst;
  int i, j;

// first round key equals key
  for (i = 0; i < 16; i++) {
   roundKeys[0][i & 0x03][i >> 2] = key[i];
  }
  roundConst = 1;
  // now calculate round keys */
  for (i = 1; i < 11; i++) {
   roundKeys[i][0][0] = (byte) (S[byteToU8(roundKeys[i - 1][1][3])]
     ^ roundKeys[i - 1][0][0] ^ roundConst);
   roundKeys[i][1][0] = (byte) (S[byteToU8(roundKeys[i - 1][2][3])] ^ roundKeys[i - 1][1][0]);
   roundKeys[i][2][0] = (byte) (S[byteToU8(roundKeys[i - 1][3][3])] ^ roundKeys[i - 1][2][0]);
   roundKeys[i][3][0] = (byte) (S[byteToU8(roundKeys[i - 1][0][3])] ^ roundKeys[i - 1][3][0]);
   for (j = 0; j < 4; j++) {
    roundKeys[i][j][1] = (byte) (roundKeys[i - 1][j][1] ^ roundKeys[i][j][0]);
    roundKeys[i][j][2] = (byte) (roundKeys[i - 1][j][2] ^ roundKeys[i][j][1]);
    roundKeys[i][j][3] = (byte) (roundKeys[i - 1][j][3] ^ roundKeys[i][j][2]);
   }
   // update round constant */
   roundConst = Xtime[byteToU8(roundConst)];
  }
 }
 
 /**
  * -------------------------------------------------------------------
  *  Rijndael encryption function.  Takes 16-byte input and creates 
  *  16-byte output (using round keys already derived from 16-byte 
  *  key).
  * -----------------------------------------------------------------
  */
 public byte[] rijndaelEncrypt(byte[] input) {
  byte[][] state = new byte[4][4];
  int i, r;

// initialise state array from input byte string
  for (i = 0; i < 16; i++) {
   state[i & 0x3][i >> 2] = input[i];
  }
  // add first round_key
  keyAdd(state, roundKeys, 0);
  // do lots of full rounds
  for (r = 1; r <= 9; r++) {
   byteSub(state);
   shiftRow(state);
   mixColumn(state);
   keyAdd(state, roundKeys, r);
  }
  // final round
  byteSub(state);
  shiftRow(state);
  keyAdd(state, roundKeys, r);
  // produce output byte string from state array
  byte[] output = new byte[16];
  for (i = 0; i < 16; i++) {
   output[i] = state[i & 0x3][i >> 2];
  }

return output;
 }
 /**
  * -------------------------------------------------------------------
  *  Rijndael decryption function.  Takes 16-byte input and creates 
  *  16-byte output (using round keys already derived from 16-byte 
  *  key).
  * -----------------------------------------------------------------
  */
 public byte[] rijndaelDecrypt(byte[] input)
 {
  //TODO
  return null;
 }

/**
  *  Round key addition function
  *  @param state[4][4]
  *  @param roundKeys[11][4][4]
  *  @param int
  */
 private void keyAdd(byte[][] state, byte[][][] roundKeys, int round)
 {
  int i, j;
  for (i=0; i<4; i++)
   for (j=0; j<4; j++)
    state[i][j] ^= roundKeys[round][i][j];
  return;
 }

/**
  *  Byte substitution transformation
  *  @param state[4][4]
  */
 private int byteSub(byte[][] state)
 {
  int i, j;
  for (i=0; i<4; i++)
   for (j=0; j<4; j++)
    state[i][j] = S[byteToU8(state[i][j])];
  return 0;
 }

/**
  *  Row shift transformation
  *  @param state[4][4]
  * 
 */
 private static void shiftRow(byte[][] state)
 {
  byte temp;
  /* left rotate row 1 by 1 */
  temp = state[1][0];
  state[1][0] = state[1][1];
  state[1][1] = state[1][2];
  state[1][2] = state[1][3];
  state[1][3] = temp;
  /* left rotate row 2 by 2 */
  temp = state[2][0];
  state[2][0] = state[2][2];
  state[2][2] = temp;
  temp = state[2][1];
  state[2][1] = state[2][3];
  state[2][3] = temp;
  /* left rotate row 3 by 3 */
  temp = state[3][0];
  state[3][0] = state[3][3];
  state[3][3] = state[3][2];
  state[3][2] = state[3][1];
  state[3][1] = temp;
  
  return;
 }
 
 /**
  *  MixColumn transformation
  *  @param state[4][4]
  */
 private void mixColumn(byte[][] state)
 {
  byte temp, tmp, tmp0;
  int i;
  /* do one column at a time */
  for (i=0; i<4;i++)
  {
   temp = (byte) (state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i]);
   tmp0 = state[0][i];
   /* Xtime array does multiply by x in GF2^8 */
   tmp = Xtime[byteToU8(state[0][i] ^ state[1][i])];
   state[0][i] ^= temp ^ tmp;

tmp = Xtime[byteToU8(state[1][i] ^ state[2][i])];
   state[1][i] ^= temp ^ tmp;

tmp = Xtime[byteToU8(state[2][i] ^ state[3][i])];
   state[2][i] ^= temp ^ tmp;

tmp = Xtime[byteToU8(state[3][i] ^ tmp0)];
   state[3][i] ^= temp ^ tmp;
  }
  
  return;
 }
 
 /**
  * byte to u8
  * java的byte存在小于0的情况,转化为无符号数
  * @param b
  * @return
  */
 private static int byteToU8(int b)
 {
  return b < 0 ? b + 256 : b ;
 }

/**--------------------- Rijndael S box table ----------------------*/
 private static byte S[] = { 99, 124, 119, 123, (byte) 242, 107, 111, (byte) 197, 48, 1,
   103, 43, (byte) 254, (byte) 215, (byte) 171, 118, (byte) 202,
   (byte) 130, (byte) 201, 125, (byte) 250, 89, 71, (byte) 240,
   (byte) 173, (byte) 212, (byte) 162, (byte) 175, (byte) 156,
   (byte) 164, 114, (byte) 192, (byte) 183, (byte) 253, (byte) 147,
   38, 54, 63, (byte) 247, (byte) 204, 52, (byte) 165, (byte) 229,
   (byte) 241, 113, (byte) 216, 49, 21, 4, (byte) 199, 35, (byte) 195,
   24, (byte) 150, 5, (byte) 154, 7, 18, (byte) 128, (byte) 226,
   (byte) 235, 39, (byte) 178, 117, 9, (byte) 131, 44, 26, 27, 110,
   90, (byte) 160, 82, 59, (byte) 214, (byte) 179, 41, (byte) 227, 47,
   (byte) 132, 83, (byte) 209, 0, (byte) 237, 32, (byte) 252,
   (byte) 177, 91, 106, (byte) 203, (byte) 190, 57, 74, 76, 88,
   (byte) 207, (byte) 208, (byte) 239, (byte) 170, (byte) 251, 67, 77,
   51, (byte) 133, 69, (byte) 249, 2, 127, 80, 60, (byte) 159,
   (byte) 168, 81, (byte) 163, 64, (byte) 143, (byte) 146, (byte) 157,
   56, (byte) 245, (byte) 188, (byte) 182, (byte) 218, 33, 16,
   (byte) 255, (byte) 243, (byte) 210, (byte) 205, 12, 19, (byte) 236,
   95, (byte) 151, 68, 23, (byte) 196, (byte) 167, 126, 61, 100, 93,
   25, 115, 96, (byte) 129, 79, (byte) 220, 34, 42, (byte) 144,
   (byte) 136, 70, (byte) 238, (byte) 184, 20, (byte) 222, 94, 11,
   (byte) 219, (byte) 224, 50, 58, 10, 73, 6, 36, 92, (byte) 194,
   (byte) 211, (byte) 172, 98, (byte) 145, (byte) 149, (byte) 228,
   121, (byte) 231, (byte) 200, 55, 109, (byte) 141, (byte) 213, 78,
   (byte) 169, 108, 86, (byte) 244, (byte) 234, 101, 122, (byte) 174,
   8, (byte) 186, 120, 37, 46, 28, (byte) 166, (byte) 180, (byte) 198,
   (byte) 232, (byte) 221, 116, 31, 75, (byte) 189, (byte) 139,
   (byte) 138, 112, 62, (byte) 181, 102, 72, 3, (byte) 246, 14, 97,
   53, 87, (byte) 185, (byte) 134, (byte) 193, 29, (byte) 158,
   (byte) 225, (byte) 248, (byte) 152, 17, 105, (byte) 217,
   (byte) 142, (byte) 148, (byte) 155, 30, (byte) 135, (byte) 233,
   (byte) 206, 85, 40, (byte) 223, (byte) 140, (byte) 161, (byte) 137,
   13, (byte) 191, (byte) 230, 66, 104, 65, (byte) 153, 45, 15,
   (byte) 176, 84, (byte) 187, 22, };

/**------- This array does the multiplication by x in GF(2^8) ------*/
 private static byte Xtime[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
   32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,
   66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,
   100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124,
   126, (byte) 128, (byte) 130, (byte) 132, (byte) 134, (byte) 136,
   (byte) 138, (byte) 140, (byte) 142, (byte) 144, (byte) 146,
   (byte) 148, (byte) 150, (byte) 152, (byte) 154, (byte) 156,
   (byte) 158, (byte) 160, (byte) 162, (byte) 164, (byte) 166,
   (byte) 168, (byte) 170, (byte) 172, (byte) 174, (byte) 176,
   (byte) 178, (byte) 180, (byte) 182, (byte) 184, (byte) 186,
   (byte) 188, (byte) 190, (byte) 192, (byte) 194, (byte) 196,
   (byte) 198, (byte) 200, (byte) 202, (byte) 204, (byte) 206,
   (byte) 208, (byte) 210, (byte) 212, (byte) 214, (byte) 216,
   (byte) 218, (byte) 220, (byte) 222, (byte) 224, (byte) 226,
   (byte) 228, (byte) 230, (byte) 232, (byte) 234, (byte) 236,
   (byte) 238, (byte) 240, (byte) 242, (byte) 244, (byte) 246,
   (byte) 248, (byte) 250, (byte) 252, (byte) 254, 27, 25, 31, 29, 19,
   17, 23, 21, 11, 9, 15, 13, 3, 1, 7, 5, 59, 57, 63, 61, 51, 49, 55,
   53, 43, 41, 47, 45, 35, 33, 39, 37, 91, 89, 95, 93, 83, 81, 87, 85,
   75, 73, 79, 77, 67, 65, 71, 69, 123, 121, 127, 125, 115, 113, 119,
   117, 107, 105, 111, 109, 99, 97, 103, 101, (byte) 155, (byte) 153,
   (byte) 159, (byte) 157, (byte) 147, (byte) 145, (byte) 151,
   (byte) 149, (byte) 139, (byte) 137, (byte) 143, (byte) 141,
   (byte) 131, (byte) 129, (byte) 135, (byte) 133, (byte) 187,
   (byte) 185, (byte) 191, (byte) 189, (byte) 179, (byte) 177,
   (byte) 183, (byte) 181, (byte) 171, (byte) 169, (byte) 175,
   (byte) 173, (byte) 163, (byte) 161, (byte) 167, (byte) 165,
   (byte) 219, (byte) 217, (byte) 223, (byte) 221, (byte) 211,
   (byte) 209, (byte) 215, (byte) 213, (byte) 203, (byte) 201,
   (byte) 207, (byte) 205, (byte) 195, (byte) 193, (byte) 199,
   (byte) 197, (byte) 251, (byte) 249, (byte) 255, (byte) 253,
   (byte) 243, (byte) 241, (byte) 247, (byte) 245, (byte) 235,
   (byte) 233, (byte) 239, (byte) 237, (byte) 227, (byte) 225,
   (byte) 231, (byte) 229 };
}

参考文档:TS 35.206 后面C++代码改写

AES - Rijndael 算法(三)的更多相关文章

  1. AES - Rijndael 算法(一)

    1997年1月,美国标准技术协会NIST开始遴选数据加密标准(Data Encryption Standard,简称DES)替代者的工作,称为高级加密标准[1’2](Advanced Enerypti ...

  2. AES - Rijndael 算法(二)

    三:Rijndael算法实现(C++版本) /*-------------------- Rijndael round subkeys ---------------------*/u8 roundK ...

  3. AES密码算法详解(转自https://www.cnblogs.com/luop/p/4334160.html)

    0 AES简介 我们知道数据加密标准(Data Encryption Standard: DES)的密钥长度是56比特,因此算法的理论安全强度是256.但二十世纪中后期正是计算机飞速发展的阶段,元器件 ...

  4. 用OpenCV实现Photoshop算法(三): 曲线调整

    http://blog.csdn.net/c80486/article/details/52499919 系列文章: 用OpenCV实现Photoshop算法(一): 图像旋转 用OpenCV实现Ph ...

  5. 分布式共识算法 (三) Raft算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 1.1 介绍 Raft 是一种为了管 ...

  6. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  7. 浅析DES与AES、RSA三种典型加密算法的比较

    DES与AES的比较 自DES 算法公诸于世以来,学术界围绕它的安全性等方面进行了研究并展开了激烈的争论.在技术上,对DES的批评主要集中在以下几个方面: 1.作为分组密码,DES 的加密单位仅有64 ...

  8. 文本比较算法三——SUNDAY 算法

    SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...

  9. 统计学习方法笔记--EM算法--三硬币例子补充

    本文,意在说明<统计学习方法>第九章EM算法的三硬币例子,公式(9.5-9.6如何而来) 下面是(公式9.5-9.8)的说明, 本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流 ...

随机推荐

  1. Linux命令之查找

    在Linux中,有非常多方法能够做到这一点.国外站点LinuxHaxor总结了五条命令,你能够看看自己知道几条.大多数程序猿,可能常常使用当中的2到3条,对这5条命令都非常熟悉的人应该是不多的. 1. ...

  2. Apache配置HTTPS协议搭载SSl配置全过程

    1.首先要开启相应的扩展和辅助的dll(ssleay32.dll,libeay32.dll)到system32下 2.生成服务器证书 安装好在bin目录下有一个openssl.exe文件,用来生成证书 ...

  3. 使用 Spring 2.5 基于注解驱动的 Spring MVC--转

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  4. IntelliJ IDEA 中module的dependencies是其它module时的注意事项

    Dependencies on other modules If a module (module A) depends on another module (module B), IntelliJ ...

  5. automatically select architectures

    各位在用XCode 5.x 打开用XCode 4.x 创建的项目时候.会遇到编译器警告automatically select architectures. 1. This is because th ...

  6. 手工释放Linux内存

    转载自:http://blog.csdn.net/wyzxg/article/details/7279986/ linux的内存查看: [root@localhost 0.1.0]# free -m  ...

  7. noip 2009 细胞分裂

    /*数论题 考察唯一分解定理 当然用到一些技巧*/ #include<iostream> #include<cstdio> #include<cstring> #d ...

  8. 正式进入C#的世界——委托

    委托(delegate)1.可以认为是这样的对象,它包含具有相同签名和返回值类型的有序方法列表.2.可以理解为函数的一个包装,它使得C#中的函数可以作为参数来被传递. 委托的定义和方法的定义类似,只是 ...

  9. python单元测试之unittest

    unittest是python标准库,从2.1开始就有. 标准的使用流程: 1:实现一个unittest.TestCase的子类 2:在其中定义以_test开头的实例函数 3:用unittest.ma ...

  10. (转)TortoiseSVN使用简介

    TortoiseSVN使用简介 TortoiseSVN使用简介 2009-04-24 来源:dev.idv.tw 1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么 ...