JAVA编程:Rabbit流密码的Java实现
来源:优易学  2011-9-29 12:43:46   【优易学:中国教育考试门户网】   资料下载   IT书店

 

 /**

  * @declaration 将一个字节数组转化为整数,采用Big-Endian格式进行解析

  * @param a待转化的字节数组

  * @param i字节数组的起始索引

  * @return转化后的整数

  */

  public static int os2ip(byte[] a, int i)

  {

  int x0 = a[i + 3] & 0x000000ff;

  int x1 = a[i + 2] << 8 & 0x0000ff00;

  int x2 = a[i + 1] << 16 & 0x00ff0000;

  int x3 = a[i] << 24 & 0xff000000;

  return x0 | x1 | x2 | x3;

  }

  /**

  * @declaration 将整数x转化为4字节数组,采用Big-Endian格式进行解析

  * @param x待转化的整数x

  * @return 解析后的字节数组,长度为4

  */

  public static byte[] i2osp(int x)

  {

  byte[] s = new byte[4];

  s[3] = (byte)( x & 0x000000ff );

  s[2] = (byte)( ( x & 0x0000ff00 ) >>> 8 );

  s[1] = (byte)( ( x & 0x00ff0000 ) >>> 16 );

  s[0] = (byte)( ( x & 0xff000000 ) >>> 24 );

  return s;

  }

  /**

  * @declaration密钥初始化函数

  * @param p_key 长度为128位的密钥数组,若密钥长度小于128位,

  *则必须在填充后再调用该函数

  */

  public void keySetup(byte[] p_key)

  {

  int k0, k1, k2, k3, i;

  k0 = os2ip(p_key, 12); k1 = os2ip(p_key, 8); k2 = os2ip(p_key, 4); k3 = os2ip(p_key, 0);

  x[0] = k0;

  x[2] = k1;

  x[4] = k2;

  x[6] = k3;

  x[1] = ( k3 << 16 ) | ( k2 >>> 16 );

  x[3] = ( k0 << 16 ) | ( k3 >>> 16 );

  x[5] = ( k1 << 16 ) | ( k0 >>> 16 );

  x[7] = ( k2 << 16 ) | ( k1 >>> 16 );

  c[0] = rotL(k2, 16); c[2] = rotL(k3, 16); c[4] = rotL(k0, 16); c[6] = rotL(k1, 16);

  c[1] = (k0 & 0xffff0000) | (k1 & 0x0000ffff);

  c[3] = (k1 & 0xffff0000) | (k2 & 0x0000ffff);

  c[5] = (k2 & 0xffff0000) | (k3 & 0x0000ffff);

  c[7] = (k3 & 0xffff0000) | (k0 & 0x0000ffff);

  carry = 0;

  for( i = 0; i < 4; i++)

  {

  next_state();

  }

  for( i = 0; i < 8; i++)

  {

  c[ (i + 4) & 7 ] ^= x[i];

  }

  }

  /**

  * @declaration 该函数用于生成128位随机密钥,用于直接和明文进行异或处理

  * @param p_dest产生的128位随机密钥

  * @param data_size 需要产生的随机密钥数量,必须是16的倍数

  */

上一页  [1] [2] [3] [4] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训