KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > security > XTEA


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.security;
6
7 import org.h2.engine.Constants;
8 import org.h2.message.Message;
9
10 /**
11  * XTEA with 32 rounds
12  * @author Tom
13  *
14  */

15 public class XTEA implements BlockCipher {
16
17     // TODO maybe implement Blowfish
18

19     // best attack reported as of 2004 is 26 rounds [wikipedia]
20
private static final int DELTA = 0x9E3779B9;
21     private int k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15;
22     private int k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31;
23
24     public void setKey(byte[] b) {
25         int[] key = new int[4];
26         for (int i = 0; i < 16;) {
27             key[i / 4] = (b[i++] << 24) + ((b[i++] & 255) << 16) + ((b[i++] & 255) << 8) + (b[i++] & 255);
28         }
29         int[] r = new int[32];
30         for (int i = 0, sum = 0; i < 32;) {
31             r[i++] = sum + key[sum & 3];
32             sum += DELTA;
33             r[i++] = sum + key[ (sum >>> 11) & 3];
34         }
35         k0=r[0];k1=r[1];k2=r[2];k3=r[3];k4=r[4];k5=r[5];k6=r[6];k7=r[7];
36         k8=r[8];k9=r[9];k10=r[10];k11=r[11];k12=r[12];k13=r[13];k14=r[14];k15=r[15];
37         k16=r[16];k17=r[17];k18=r[18];k19=r[19];k20=r[20];k21=r[21];k22=r[22];k23=r[23];
38         k24=r[24];k25=r[25];k26=r[26];k27=r[27];k28=r[28];k29=r[29];k30=r[30];k31=r[31];
39    }
40
41     public void encrypt(byte[] bytes, int off, int len) {
42         if (Constants.CHECK && (len % ALIGN != 0)) {
43             throw Message.getInternalError("unaligned len " + len);
44         }
45         for (int i = off; i < off + len; i += 8) {
46             encryptBlock(bytes, bytes, i);
47         }
48     }
49
50     public void decrypt(byte[] bytes, int off, int len) {
51         if (Constants.CHECK && (len % ALIGN != 0)) {
52             throw Message.getInternalError("unaligned len " + len);
53         }
54         for (int i = off; i < off + len; i += 8) {
55             decryptBlock(bytes, bytes, i);
56         }
57     }
58
59     public void encryptBlock(byte[] in, byte[] out, int off) {
60         int y = (in[off] << 24) | ((in[off+1] & 255) << 16) | ((in[off+2] & 255) << 8) | (in[off+3] & 255);
61         int z = (in[off+4] << 24) | ((in[off+5] & 255) << 16) | ((in[off+6] & 255) << 8) | (in[off+7] & 255);
62         y += (((z << 4) ^ (z >>> 5)) + z) ^ k0 ; z += (((y >>> 5) ^ (y << 4)) + y) ^ k1;
63         y += (((z << 4) ^ (z >>> 5)) + z) ^ k2 ; z += (((y >>> 5) ^ (y << 4)) + y) ^ k3;
64         y += (((z << 4) ^ (z >>> 5)) + z) ^ k4; z += (((y >>> 5) ^ (y << 4)) + y) ^ k5;
65         y += (((z << 4) ^ (z >>> 5)) + z) ^ k6; z += (((y >>> 5) ^ (y << 4)) + y) ^ k7;
66         y += (((z << 4) ^ (z >>> 5)) + z) ^ k8; z += (((y >>> 5) ^ (y << 4)) + y) ^ k9;
67         y += (((z << 4) ^ (z >>> 5)) + z) ^ k10; z += (((y >>> 5) ^ (y << 4)) + y) ^ k11;
68         y += (((z << 4) ^ (z >>> 5)) + z) ^ k12; z += (((y >>> 5) ^ (y << 4)) + y) ^ k13;
69         y += (((z << 4) ^ (z >>> 5)) + z) ^ k14; z += (((y >>> 5) ^ (y << 4)) + y) ^ k15;
70         y += (((z << 4) ^ (z >>> 5)) + z) ^ k16; z += (((y >>> 5) ^ (y << 4)) + y) ^ k17;
71         y += (((z << 4) ^ (z >>> 5)) + z) ^ k18; z += (((y >>> 5) ^ (y << 4)) + y) ^ k19;
72         y += (((z << 4) ^ (z >>> 5)) + z) ^ k20; z += (((y >>> 5) ^ (y << 4)) + y) ^ k21;
73         y += (((z << 4) ^ (z >>> 5)) + z) ^ k22; z += (((y >>> 5) ^ (y << 4)) + y) ^ k23;
74         y += (((z << 4) ^ (z >>> 5)) + z) ^ k24; z += (((y >>> 5) ^ (y << 4)) + y) ^ k25;
75         y += (((z << 4) ^ (z >>> 5)) + z) ^ k26; z += (((y >>> 5) ^ (y << 4)) + y) ^ k27;
76         y += (((z << 4) ^ (z >>> 5)) + z) ^ k28; z += (((y >>> 5) ^ (y << 4)) + y) ^ k29;
77         y += (((z << 4) ^ (z >>> 5)) + z) ^ k30; z += (((y >>> 5) ^ (y << 4)) + y) ^ k31;
78         out[off] = (byte) (y >> 24); out[off+1] = (byte) (y >> 16); out[off+2] = (byte) (y >> 8); out[off+3] = (byte) y;
79         out[off+4] = (byte) (z >> 24); out[off+5] = (byte) (z >> 16); out[off+6] = (byte) (z >> 8); out[off+7] = (byte) z;
80     }
81
82     public void decryptBlock(byte[] in, byte[] out, int off) {
83         int y = (in[off] << 24) | ((in[off+1] & 255) << 16) | ((in[off+2] & 255) << 8) | (in[off+3] & 255) ;
84         int z = (in[off+4] << 24) | ((in[off+5] & 255) << 16) | ((in[off+6] & 255) << 8) | (in[off+7] & 255);
85         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k31; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k30;
86         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k29; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k28;
87         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k27; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k26;
88         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k25; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k24;
89         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k23; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k22;
90         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k21; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k20;
91         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k19; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k18;
92         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k17; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k16;
93         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k15; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k14;
94         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k13; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k12;
95         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k11; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k10;
96         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k9; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k8;
97         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k7; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k6;
98         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k5; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k4;
99         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k3; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k2;
100         z -= (((y >>> 5) ^ (y << 4)) + y) ^ k1; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k0;
101         out[off] = (byte) (y >> 24); out[off+1] = (byte) (y >> 16); out[off+2] = (byte) (y >> 8); out[off+3] = (byte) y;
102         out[off+4] = (byte) (z >> 24); out[off+5] = (byte) (z >> 16); out[off+6] = (byte) (z >> 8); out[off+7] = (byte) z;
103     }
104
105     public int getKeyLength() {
106         return 16;
107     }
108
109 }
110
Popular Tags