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

  Rabbit流密码是由Cryptico公司(http://www.cryptico.com)设计的,密钥长度128位,

  最大加密消息长度为264 Bytes,即16 TB,若消息超过该长度,则需要更换密钥对剩下的消息进行处理。它是目前安全性较高,加/解密速度比较高效的流密码之一,在各种处理器平台上都有不凡的表现。

  详细资料:

  1.http://www.cryptico.com/Files/filer/rabbit_fse.pdf

  2.http://www.ietf.org/rfc/rfc4503.txt

  本文实现了该算法的java语言实现,仅供参考。

  2.  实现源码

  view plaincopy to clipboardprint?

  /**

  * The Java Implementation of Rabbit Stream Cipher

  * @author cnbragon

  * @email cnbragon_dot_163_dot_com

  * @date 2009/09/25

  * @note Not implemented IV scheme

  * @Reference:

  * 1.http://www.cryptico.com/Files/filer/rabbit_fse.pdf * 2.http://www.ietf.org/rfc/rfc4503.txt

  */

  class Rabbit

  {

  private int[] x = new int[8];

  private int[] c = new int[8];

  private int carry;

  public void Rabbit()

  {

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

  {

  x[i] = c[i] = 0;

  }

  carry = 0;

  }

  private int g_func(int x)

  {

  int a = x & 0xffff;

  int b = x >>> 16;

  int h =( ( ( ( a * a ) >>> 17 ) + ( a * b ) ) >>> 15 ) + b * b;

  int l = x * x;

  return h ^ l;

  }

  /**

  * @declaration 比较两个无符号整数的十六进制的大小,即作为无符号整数进行比较

  * @param x

  * @param y

  * @return 若(unsigned x) < (unsigned y),则返回1,否则返回0

  */

  private int compare(int x, int y)

  {

  long a = x;

  long b = y;

  a &= 0x00000000ffffffffl;

  b &= 0x00000000ffffffffl;

  return (a < b) ? 1 : 0;

  }

  private int rotL(int x, int y)

  {

  return ( x << y ) | ( x >>> (32 - y) );

  }

  private void next_state()

  {

  int[] g = new int[8];

  int[] c_old = new int[8];

  int i = 0;

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

  {

  c_old[i] = c[i];

  }

  c[0] += 0x4d34d34d + carry;

  c[1] += 0xd34d34d3 + compare(c[0], c_old[0]); c[2] += 0x34d34d34 + compare(c[1], c_old[1]); c[3] += 0x4d34d34d + compare(c[2], c_old[2]); c[4] += 0xd34d34d3 + compare(c[3], c_old[3]); c[5] += 0x34d34d34 + compare(c[4], c_old[4]); c[6] += 0x4d34d34d + compare(c[5], c_old[5]); c[7] += 0xd34d34d3 + compare(c[6], c_old[6]); carry = compare(c[7], c_old[7]);

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

  {

  g[i] = g_func(x[i] + c[i]);

  }

  x[0] = g[0] + rotL(g[7], 16) + rotL(g[6], 16); x[1] = g[1] + rotL(g[0], 8 ) + g[7]; x[2] = g[2] + rotL(g[1], 16) + rotL(g[0], 16); x[3] = g[3] + rotL(g[2], 8 ) + g[1]; x[4] = g[4] + rotL(g[3], 16) + rotL(g[2], 16); x[5] = g[5] + rotL(g[4], 8 ) + g[3]; x[6] = g[6] + rotL(g[5], 16) + rotL(g[4], 16); x[7] = g[7] + rotL(g[6], 8 ) + g[5];

  }

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

责任编辑:小草

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