| 1 package com.quadcap.crypto; 2 3 40 41 import java.util.Random ; 42 43 import java.nio.ByteBuffer ; 44 import java.nio.LongBuffer ; 45 46 import com.quadcap.util.text.Text; 47 import com.quadcap.util.Util; 48 49 58 public class Tea256 extends AbstractSymmetricKey implements SymmetricKey { 59 61 static final long delta = 0x9E3779B97F4A7C15L; 62 static final int rounds = 32; 63 64 long a, b, c, d; 65 long[] v = new long[2]; 66 67 70 public void init(String s) { 71 String [] vx = Text.extractN(s, "*:*:*:*:*"); 72 a = Long.parseLong(vx[1]); 73 b = Long.parseLong(vx[2]); 74 c = Long.parseLong(vx[3]); 75 d = Long.parseLong(vx[4]); 76 } 77 78 public void init(byte[] k) { 79 a = Util.bytesToLong(k, 0); 80 b = Util.bytesToLong(k, 8); 81 c = Util.bytesToLong(k, 16); 82 d = Util.bytesToLong(k, 24); 83 } 84 85 88 public void init(Random r) { 89 a = r.nextLong(); 90 b = r.nextLong(); 91 c = r.nextLong(); 92 d = r.nextLong(); 93 } 94 95 98 public String toString() { 99 return "TEA256:" + a + ":" + b + ":" + c + ":" + d; 100 } 101 102 105 public void encrypt(ByteBuffer plain, ByteBuffer code) { 106 LongBuffer p = plain.asLongBuffer(); 107 LongBuffer cb = code.asLongBuffer(); 108 for (int i = 0; i < p.limit(); i += 2) { 109 v[0] = p.get(i); 110 v[1] = p.get(i+1); 111 encrypt(v); 112 cb.put(i, v[0]); 113 cb.put(i+1, v[1]); 114 } 115 } 116 117 120 public void decrypt(ByteBuffer code, ByteBuffer plain) { 121 LongBuffer p = plain.asLongBuffer(); 122 LongBuffer cb = code.asLongBuffer(); 123 for (int i = 0; i < cb.limit(); i += 2) { 124 v[0] = cb.get(i); 125 v[1] = cb.get(i+1); 126 decrypt(v); 127 p.put(i, v[0]); 128 p.put(i+1, v[1]); 129 } 130 } 131 132 public int getBlockSize() { return 16; } 133 134 final void encrypt(long[] v) { 135 long y = v[0]; 136 long z = v[1]; 137 long sum = 0; 138 139 for (int n = rounds; n-- > 0; ) { 140 sum += delta; 141 y += (z << 4) + a ^ z + sum ^ (z >>> 5) + b; 142 z += (y << 4) + c ^ y + sum ^ (y >>> 5) + d; 143 } 144 v[0] = y; 145 v[1] = z; 146 } 147 148 final void decrypt(long[] v) { 149 long y = v[0]; 150 long z = v[1]; 151 long sum = delta * rounds; 152 for (int n = rounds; n-- > 0; ) { 153 z -= (y << 4) + c ^ y + sum ^ (y >>> 5) + d; 154 y -= (z << 4) + a ^ z + sum ^ (z >>> 5) + b; 155 sum -= delta; 156 } 157 v[0] = y; 158 v[1] = z; 159 } 160 } 161 | Popular Tags |