Chiddix

ISSACCipher

Dec 9th, 2011
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.22 KB | None | 0 0
  1. public class ISAACCipher {
  2.  
  3.     public static final int RATIO = 0x9e3779b9;
  4.     public static final int SIZE_LOG = 8;
  5.     public static final int SIZE = 1 << SIZE_LOG;
  6.     public static final int MASK = (SIZE - 1) << 2;
  7.     private int count = 0;
  8.  
  9.     private int results[] = new int[SIZE];
  10.     private int memory[] = new int[SIZE];
  11.  
  12.     private int a;
  13.     private int b;
  14.     private int c;
  15.  
  16.     public ISAACCipher(int[] seed) {
  17.         for(int i = 0; i < seed.length; i++) {
  18.             results[i] = seed[i];
  19.         }
  20.         init(true);
  21.     }
  22.  
  23.     public int getNextValue() {
  24.         if(count-- == 0) {
  25.             isaac();
  26.             count = SIZE - 1;
  27.         }
  28.         return results[count];
  29.     }
  30.  
  31.     public void isaac() {
  32.         int i, j, x, y;
  33.         b += ++c;
  34.         for(i = 0, j = SIZE / 2; i < SIZE / 2;) {
  35.             x = memory[i];
  36.             a ^= a << 13;
  37.             a += memory[j++];
  38.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  39.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  40.  
  41.             x = memory[i];
  42.             a ^= a >>> 6;
  43.             a += memory[j++];
  44.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  45.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  46.  
  47.             x = memory[i];
  48.             a ^= a << 2;
  49.             a += memory[j++];
  50.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  51.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  52.  
  53.             x = memory[i];
  54.             a ^= a >>> 16;
  55.             a += memory[j++];
  56.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  57.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  58.         }
  59.         for(j = 0; j < SIZE / 2;) {
  60.             x = memory[i];
  61.             a ^= a << 13;
  62.             a += memory[j++];
  63.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  64.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  65.  
  66.             x = memory[i];
  67.             a ^= a >>> 6;
  68.             a += memory[j++];
  69.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  70.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  71.  
  72.             x = memory[i];
  73.             a ^= a << 2;
  74.             a += memory[j++];
  75.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  76.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  77.  
  78.             x = memory[i];
  79.             a ^= a >>> 16;
  80.             a += memory[j++];
  81.             memory[i] = y = memory[(x & MASK) >> 2] + a + b;
  82.             results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x;
  83.         }
  84.     }
  85.  
  86.     public void init(boolean flag) {
  87.         int i;
  88.         int a, b, c, d, e, f, g, h;
  89.         a = b = c = d = e = f = g = h = RATIO;
  90.         for(i = 0; i < 4; ++i) {
  91.             a ^= b << 11;
  92.             d += a;
  93.             b += c;
  94.             b ^= c >>> 2;
  95.             e += b;
  96.             c += d;
  97.             c ^= d << 8;
  98.             f += c;
  99.             d += e;
  100.             d ^= e >>> 16;
  101.             g += d;
  102.             e += f;
  103.             e ^= f << 10;
  104.             h += e;
  105.             f += g;
  106.             f ^= g >>> 4;
  107.             a += f;
  108.             g += h;
  109.             g ^= h << 8;
  110.             b += g;
  111.             h += a;
  112.             h ^= a >>> 9;
  113.             c += h;
  114.             a += b;
  115.         }
  116.         for(i = 0; i < SIZE; i += 8) {
  117.             if(flag) {
  118.                 a += results[i];
  119.                 b += results[i + 1];
  120.                 c += results[i + 2];
  121.                 d += results[i + 3];
  122.                 e += results[i + 4];
  123.                 f += results[i + 5];
  124.                 g += results[i + 6];
  125.                 h += results[i + 7];
  126.             }
  127.             a ^= b << 11;
  128.             d += a;
  129.             b += c;
  130.             b ^= c >>> 2;
  131.             e += b;
  132.             c += d;
  133.             c ^= d << 8;
  134.             f += c;
  135.             d += e;
  136.             d ^= e >>> 16;
  137.             g += d;
  138.             e += f;
  139.             e ^= f << 10;
  140.             h += e;
  141.             f += g;
  142.             f ^= g >>> 4;
  143.             a += f;
  144.             g += h;
  145.             g ^= h << 8;
  146.             b += g;
  147.             h += a;
  148.             h ^= a >>> 9;
  149.             c += h;
  150.             a += b;
  151.             memory[i] = a;
  152.             memory[i + 1] = b;
  153.             memory[i + 2] = c;
  154.             memory[i + 3] = d;
  155.             memory[i + 4] = e;
  156.             memory[i + 5] = f;
  157.             memory[i + 6] = g;
  158.             memory[i + 7] = h;
  159.         }
  160.         if(flag) {
  161.             for(i = 0; i < SIZE; i += 8) {
  162.                 a += memory[i];
  163.                 b += memory[i + 1];
  164.                 c += memory[i + 2];
  165.                 d += memory[i + 3];
  166.                 e += memory[i + 4];
  167.                 f += memory[i + 5];
  168.                 g += memory[i + 6];
  169.                 h += memory[i + 7];
  170.                 a ^= b << 11;
  171.                 d += a;
  172.                 b += c;
  173.                 b ^= c >>> 2;
  174.                 e += b;
  175.                 c += d;
  176.                 c ^= d << 8;
  177.                 f += c;
  178.                 d += e;
  179.                 d ^= e >>> 16;
  180.                 g += d;
  181.                 e += f;
  182.                 e ^= f << 10;
  183.                 h += e;
  184.                 f += g;
  185.                 f ^= g >>> 4;
  186.                 a += f;
  187.                 g += h;
  188.                 g ^= h << 8;
  189.                 b += g;
  190.                 h += a;
  191.                 h ^= a >>> 9;
  192.                 c += h;
  193.                 a += b;
  194.                 memory[i] = a;
  195.                 memory[i + 1] = b;
  196.                 memory[i + 2] = c;
  197.                 memory[i + 3] = d;
  198.                 memory[i + 4] = e;
  199.                 memory[i + 5] = f;
  200.                 memory[i + 6] = g;
  201.                 memory[i + 7] = h;
  202.             }
  203.         }
  204.         isaac();
  205.         count = SIZE;
  206.     }
  207.  
  208. }
Advertisement
Add Comment
Please, Sign In to add comment