设为首页 加入收藏

TOP

Rabbit流密码的Java实现
2014-11-23 19:43:55 】 浏览:3971
Tags:Rabbit 密码 Java 实现

  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];


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java优化编程:内存管理 下一篇实现查询条件的保存

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目