KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > webman > util > security > EncryptUtil


1 package de.webman.util.security;
2
3
4 import java.security.*;
5
6
7 /**
8  * Utility class for encrypting strings using a MD5 algorithm.
9  *
10  * @author <a HREF="mailto:gregor@webman.de">Gregor Klinke</a>
11  * @version $Revision: 1.2 $
12  **/

13 public class EncryptUtil
14 {
15     /* $Id: EncryptUtil.java,v 1.2 2002/04/12 13:55:58 gregor Exp $ */
16
17     /**
18      * contains the base64 char table encoding; used for the external
19      * printable form of digest md5 arrays
20      **/

21     private static final String JavaDoc[] BASE64_CHAR = {
22         "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
23         "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f",
24         "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
25         "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"
26     };
27
28     /**
29      * contains the rev. lookup for the base64 encoding
30      */

31     private static final int[] DEC64 = {
32         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00 */
33         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10 */
34         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, /* 0x20 */
35         52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, /* 0x30 */
36         -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 0x40 */
37         15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, /* 0x50 */
38         -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 0x60 */
39         41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 /* 0x70 */
40     };
41
42     /**
43      * encodes a string to base64 encoding
44      * @param str the string to encode
45      * @return the base64 encoded string
46      **/

47     private static String JavaDoc encodeBase64(String JavaDoc str) {
48         byte[] dig = str.getBytes();
49         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
50         
51         int f0 = 0;
52         int r = 0;
53         int state = 0;
54         int j = 0;
55         int d0 = 0;
56         while (j < dig.length) {
57             switch (state) {
58             case 0:
59                 d0 = (dig[j] >= 0) ? dig[j] : 256 + dig[j];
60                 f0 = d0 & 0x3f;
61                 r = (d0 & 0xc0) >> 6;
62                 state = 1;
63                 j++;
64                 break;
65             case 1:
66                 d0 = (dig[j] >= 0) ? dig[j] : 256 + dig[j];
67                 f0 = r | (d0 & 0x0f) << 2;
68                 r = (d0 & 0xf0) >> 4;
69                 state = 2;
70                 j++;
71                 break;
72             case 2:
73                 d0 = (dig[j] >= 0) ? dig[j] : 256 + dig[j];
74                 f0 = r | (d0 & 0x03) << 4;
75                 r = (d0 & 0xfc) >> 2;
76                 state = 3;
77                 j++;
78                 break;
79             case 3:
80                 f0 = r;
81                 r = 0;
82                 state = 0;
83                 break;
84             }
85             
86             buf.append(BASE64_CHAR[f0]);
87         }
88
89         if (state != 0)
90             buf.append (BASE64_CHAR[r]);
91         
92         return buf.toString();
93     }
94
95     /**
96      * decodes a string from base64
97      * @param str the string to decode
98      * @return the decoded string
99      */

100     private static String JavaDoc decodeBase64(String JavaDoc str) {
101         byte[] dig = str.getBytes();
102         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
103         int rc = 0;
104         int r = 0;
105         int f0 = 0;
106         int d0 = 0;
107         int d1 = 0;
108         int state = 0;
109         for (int j = 0; j < dig.length; j++) {
110             switch (state) {
111             case 0:
112                 r = DEC64[(dig[j] >= 0) ? dig[j] : 256 + dig[j]];
113                 f0 = -1;
114                 state = 1;
115                 break;
116             case 1:
117                 d0 = DEC64[(dig[j] >= 0) ? dig[j] : 256 + dig[j]];
118                 f0 = r | ((d0 & 0x03) << 6);
119                 r = (d0 & 0x3c) >> 2;
120                 state = 2;
121                 break;
122             case 2:
123                 d0 = DEC64[(dig[j] >= 0) ? dig[j] : 256 + dig[j]];
124                 f0 = r | ((d0 & 0x0f) << 4);
125                 r = (d0 & 0x30) >> 4;
126                 state = 3;
127                 break;
128             case 3:
129                 d0 = DEC64[(dig[j] >= 0) ? dig[j] : 256 + dig[j]];
130                 f0 = r | (d0 << 2);
131                 r = 0;
132                 state = 0;
133                 break;
134             }
135             
136             if (f0 > 0)
137                 buf.append((char)f0);
138         }
139         
140         if (state != 0 && r > 0)
141             buf.append((char)r);
142         
143         return buf.toString();
144     }
145
146     /**
147      * encrypts a string and returns it base64 encoded
148      * @param str the string to encode
149      * @return the base64 encoded string
150      **/

151     public static String JavaDoc encrypt(String JavaDoc str) {
152         if (str != null)
153             return encodeBase64(new Encrypter().encrypt(str));
154         return null;
155     }
156
157     /**
158      * takes a base64 encoded, encrypted string and decodes and decrypts it
159      * @param str the string to decode
160      * @return the decrypted string
161      **/

162     public static String JavaDoc decrypt(String JavaDoc str) {
163         if (str != null)
164             return new Encrypter().decrypt(decodeBase64(str));
165         return null;
166     }
167
168     /**
169      * the main method
170      * @args guess what
171      **/

172     public static void main(String JavaDoc[] args) {
173
174         for (int i = 0; i < args.length; i++) {
175             System.out.println("[" + EncryptUtil.encrypt(args[i]) + "]");
176         }
177                 
178     }
179
180
181
182
183 }
184
185
186
187
188 class Encrypter {
189     private static final int C1 = 21777;
190     private static final int C2 = 31709;
191     
192     private int r = 42173;
193
194     public int enc(byte b) {
195         return enc((b >= 0) ? b : 256 + b);
196     }
197     
198     public int dec(byte b) {
199         return dec((b >= 0) ? b : 256 + b);
200     }
201     
202     public int enc(int plain) {
203         int cipher = plain ^ (r >> 8);
204         r = ((cipher + r) * C1 + C2) & 0xffff;
205         return cipher;
206     }
207
208     public int dec(int cipher) {
209         int plain = cipher ^ (r >> 8);
210         r = ((cipher + r) * C1 + C2) & 0xffff;
211         return plain;
212     }
213     
214     public String JavaDoc encrypt(String JavaDoc str) {
215         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
216         byte b[] = str.getBytes();
217         
218         for (int i = 0; i < b.length; i++) {
219             buf.append((char)enc(b[i]));
220         }
221         
222         return buf.toString();
223     }
224     
225     public String JavaDoc decrypt(String JavaDoc str) {
226         byte[] b = str.getBytes();
227         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
228         
229         for (int i = 0; i < b.length; i++) {
230             buf.append ((char)dec(b[i]));
231         }
232         return buf.toString();
233     }
234 }
235
Popular Tags