1 2 package ch.ethz.ssh2.crypto; 3 4 import java.io.CharArrayWriter ; 5 import java.io.IOException ; 6 7 13 public class Base64 14 { 15 static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); 16 17 public static char[] encode(byte[] content) 18 { 19 CharArrayWriter cw = new CharArrayWriter ((4 * content.length) / 3); 20 21 int idx = 0; 22 23 int x = 0; 24 25 for (int i = 0; i < content.length; i++) 26 { 27 if (idx == 0) 28 x = (content[i] & 0xff) << 16; 29 else if (idx == 1) 30 x = x | ((content[i] & 0xff) << 8); 31 else 32 x = x | (content[i] & 0xff); 33 34 idx++; 35 36 if (idx == 3) 37 { 38 cw.write(alphabet[x >> 18]); 39 cw.write(alphabet[(x >> 12) & 0x3f]); 40 cw.write(alphabet[(x >> 6) & 0x3f]); 41 cw.write(alphabet[x & 0x3f]); 42 43 idx = 0; 44 } 45 } 46 47 if (idx == 1) 48 { 49 cw.write(alphabet[x >> 18]); 50 cw.write(alphabet[(x >> 12) & 0x3f]); 51 cw.write('='); 52 cw.write('='); 53 } 54 55 if (idx == 2) 56 { 57 cw.write(alphabet[x >> 18]); 58 cw.write(alphabet[(x >> 12) & 0x3f]); 59 cw.write(alphabet[(x >> 6) & 0x3f]); 60 cw.write('='); 61 } 62 63 return cw.toCharArray(); 64 } 65 66 public static byte[] decode(char[] message) throws IOException 67 { 68 byte buff[] = new byte[4]; 69 byte dest[] = new byte[message.length]; 70 71 int bpos = 0; 72 int destpos = 0; 73 74 for (int i = 0; i < message.length; i++) 75 { 76 int c = message[i]; 77 78 if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t')) 79 continue; 80 81 if ((c >= 'A') && (c <= 'Z')) 82 { 83 buff[bpos++] = (byte) (c - 'A'); 84 } 85 else if ((c >= 'a') && (c <= 'z')) 86 { 87 buff[bpos++] = (byte) ((c - 'a') + 26); 88 } 89 else if ((c >= '0') && (c <= '9')) 90 { 91 buff[bpos++] = (byte) ((c - '0') + 52); 92 } 93 else if (c == '+') 94 { 95 buff[bpos++] = 62; 96 } 97 else if (c == '/') 98 { 99 buff[bpos++] = 63; 100 } 101 else if (c == '=') 102 { 103 buff[bpos++] = 64; 104 } 105 else 106 { 107 throw new IOException ("Illegal char in base64 code."); 108 } 109 110 if (bpos == 4) 111 { 112 bpos = 0; 113 114 if (buff[0] == 64) 115 break; 116 117 if (buff[1] == 64) 118 throw new IOException ("Unexpected '=' in base64 code."); 119 120 if (buff[2] == 64) 121 { 122 int v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f))); 123 dest[destpos++] = (byte) (v >> 4); 124 break; 125 } 126 else if (buff[3] == 64) 127 { 128 int v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f))); 129 dest[destpos++] = (byte) (v >> 10); 130 dest[destpos++] = (byte) (v >> 2); 131 break; 132 } 133 else 134 { 135 int v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f))); 136 dest[destpos++] = (byte) (v >> 16); 137 dest[destpos++] = (byte) (v >> 8); 138 dest[destpos++] = (byte) (v); 139 } 140 } 141 } 142 143 byte[] res = new byte[destpos]; 144 System.arraycopy(dest, 0, res, 0, destpos); 145 146 return res; 147 } 148 } 149 | Popular Tags |