· 7 years ago · Mar 08, 2018, 05:28 AM
1/*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 */
6package test;
7
8import java.io.BufferedReader;
9import java.io.InputStreamReader;
10import java.util.Base64;
11import javax.crypto.Cipher;
12import javax.crypto.KeyGenerator;
13import javax.crypto.SecretKey;
14
15private static int[] K;
16
17private static int [] s_box ={
18 0x09d0c479, 0x28c8ffe0, 0x84aa6c39, 0x9dad7287, 0x7dff9be3, 0xd4268361, 0xc96da1d4, 0x7974cc93, 0x85d0582e, 0x2a4b5705,
19 0x1ca16a62, 0xc3bd279d, 0x0f1f25e5, 0x5160372f, 0xc695c1fb, 0x4d7ff1e4, 0xae5f6bf4, 0x0d72ee46, 0xff23de8a, 0xb1cf8e83,
20 0xf14902e2, 0x3e981e42, 0x8bf53eb6, 0x7f4bf8ac, 0x83631f83, 0x25970205, 0x76afe784, 0x3a7931d4, 0x4f846450, 0x5c64c3f6,
21 0x210a5f18, 0xc6986a26, 0x28f4e826, 0x3a60a81c, 0xd340a664, 0x7ea820c4, 0x526687c5, 0x7eddd12b, 0x32a11d1d, 0x9c9ef086,
22 0x80f6e831, 0xab6f04ad, 0x56fb9b53, 0x8b2e095c, 0xb68556ae, 0xd2250b0d, 0x294a7721, 0xe21fb253, 0xae136749, 0xe82aae86,
23 0x93365104, 0x99404a66, 0x78a784dc, 0xb69ba84b, 0x04046793, 0x23db5c1e, 0x46cae1d6, 0x2fe28134, 0x5a223942, 0x1863cd5b,
24 0xc190c6e3, 0x07dfb846, 0x6eb88816, 0x2d0dcc4a, 0xa4ccae59, 0x3798670d, 0xcbfa9493, 0x4f481d45, 0xeafc8ca8, 0xdb1129d6,
25 0xb0449e20, 0x0f5407fb, 0x6167d9a8, 0xd1f45763, 0x4daa96c3, 0x3bec5958, 0xababa014, 0xb6ccd201, 0x38d6279f, 0x02682215,
26 0x8f376cd5, 0x092c237e, 0xbfc56593, 0x32889d2c, 0x854b3e95, 0x05bb9b43, 0x7dcd5dcd, 0xa02e926c, 0xfae527e5, 0x36a1c330,
27 0x3412e1ae, 0xf257f462, 0x3c4f1d71, 0x30a2e809, 0x68e5f551, 0x9c61ba44, 0x5ded0ab8, 0x75ce09c8, 0x9654f93e, 0x698c0cca,
28 0x243cb3e4, 0x2b062b97, 0x0f3b8d9e, 0x00e050df, 0xfc5d6166, 0xe35f9288, 0xc079550d, 0x0591aee8, 0x8e531e74, 0x75fe3578,
29 0x2f6d829a, 0xf60b21ae, 0x95e8eb8d, 0x6699486b, 0x901d7d9b, 0xfd6d6e31, 0x1090acef, 0xe0670dd8, 0xdab2e692, 0xcd6d4365,
30 0xe5393514, 0x3af345f0, 0x6241fc4d, 0x460da3a3, 0x7bcf3729, 0x8bf1d1e0, 0x14aac070, 0x1587ed55, 0x3afd7d3e, 0xd2f29e01,
31 0x29a9d1f6, 0xefb10c53, 0xcf3b870f, 0xb414935c, 0x664465ed, 0x024acac7, 0x59a744c1, 0x1d2936a7, 0xdc580aa6, 0xcf574ca8,
32 0x040a7a10, 0x6cd81807, 0x8a98be4c, 0xaccea063, 0xc33e92b5, 0xd1e0e03d, 0xb322517e, 0x2092bd13, 0x386b2c4a, 0x52e8dd58,
33 0x58656dfb, 0x50820371, 0x41811896, 0xe337ef7e, 0xd39fb119, 0xc97f0df6, 0x68fea01b, 0xa150a6e5, 0x55258962, 0xeb6ff41b,
34 0xd7c9cd7a, 0xa619cd9e, 0xbcf09576, 0x2672c073, 0xf003fb3c, 0x4ab7a50b, 0x1484126a, 0x487ba9b1, 0xa64fc9c6, 0xf6957d49,
35 0x38b06a75, 0xdd805fcd, 0x63d094cf, 0xf51c999e, 0x1aa4d343, 0xb8495294, 0xce9f8e99, 0xbffcd770, 0xc7c275cc, 0x378453a7,
36 0x7b21be33, 0x397f41bd, 0x4e94d131, 0x92cc1f98, 0x5915ea51, 0x99f861b7, 0xc9980a88, 0x1d74fd5f, 0xb0a495f8, 0x614deed0,
37 0xb5778eea, 0x5941792d, 0xfa90c1f8, 0x33f824b4, 0xc4965372, 0x3ff6d550, 0x4ca5fec0, 0x8630e964, 0x5b3fbbd6, 0x7da26a48,
38 0xb203231a, 0x04297514, 0x2d639306, 0x2eb13149, 0x16a45272, 0x532459a0, 0x8e5f4872, 0xf966c7d9, 0x07128dc0, 0x0d44db62,
39 0xafc8d52d, 0x06316131, 0xd838e7ce, 0x1bc41d00, 0x3a2e8c0f, 0xea83837e, 0xb984737d, 0x13ba4891, 0xc4f8b949, 0xa6d6acb3,
40 0xa215cdce, 0x8359838b, 0x6bd1aa31, 0xf579dd52, 0x21b93f93, 0xf5176781, 0x187dfdde, 0xe94aeb76, 0x2b38fd54, 0x431de1da,
41 0xab394825, 0x9ad3048f, 0xdfea32aa, 0x659473e3, 0x623f7863, 0xf3346c59, 0xab3ab685, 0x3346a90b, 0x6b56443e, 0xc6de01f8,
42 0x8d421fc0, 0x9b0ed10c, 0x88f1a1e9, 0x54c1f029, 0x7dead57b, 0x8d7ba426, 0x4cf5178a, 0x551a7cca, 0x1a9a5f08, 0xfcd651b9,
43 0x25605182, 0xe11fc6c3, 0xb6fd9676, 0x337b3027, 0xb7c8eb14, 0x9e5fd030, 0x6b57e354, 0xad913cf7, 0x7e16688d, 0x58872a69,
44 0x2c2fc7df, 0xe389ccc6, 0x30738df1, 0x0824a734, 0xe1797a8b, 0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, 0x73f9a978, 0x73398d32,
45 0x0f59573e, 0xe9df2b03, 0xe8a5b6c8, 0x848d0704, 0x98df93c2, 0x720a1dc3, 0x684f259a, 0x943ba848, 0xa6370152, 0x863b5ea3,
46 0xd17b978b, 0x6d9b58ef, 0x0a700dd4, 0xa73d36bf, 0x8e6a0829, 0x8695bc14, 0xe35b3447, 0x933ac568, 0x8894b022, 0x2f511c27,
47 0xddfbcc3c, 0x006662b6, 0x117c83fe, 0x4e12b414, 0xc2bca766, 0x3a2fec10, 0xf4562420, 0x55792e2a, 0x46f5d857, 0xceda25ce,
48 0xc3601d3b, 0x6c00ab46, 0xefac9c28, 0xb3c35047, 0x611dfee3, 0x257c3207, 0xfdd58482, 0x3b14d84f, 0x23becb64, 0xa075f3a3,
49 0x088f8ead, 0x07adf158, 0x7796943c, 0xfacabf3d, 0xc09730cd, 0xf7679969, 0xda44e9ed, 0x2c854c12, 0x35935fa3, 0x2f057d9f,
50 0x690624f8, 0x1cb0bafd, 0x7b0dbdc6, 0x810f23bb, 0xfa929a1a, 0x6d969a17, 0x6742979b, 0x74ac7d05, 0x010e65c4, 0x86a3d963,
51 0xf907b5a0, 0xd0042bd3, 0x158d7d03, 0x287a8255, 0xbba8366f, 0x096edc33, 0x21916a7b, 0x77b56b86, 0x951622f9, 0xa6c5e650,
52 0x8cea17d1, 0xcd8c62bc, 0xa3d63433, 0x358a68fd, 0x0f9b9d3c, 0xd6aa295b, 0xfe33384a, 0xc000738e, 0xcd67eb2f, 0xe2eb6dc2,
53 0x97338b02, 0x06c9f246, 0x419cf1ad, 0x2b83c045, 0x3723f18a, 0xcb5b3089, 0x160bead7, 0x5d494656, 0x35f8a74b, 0x1e4e6c9e,
54 0x000399bd, 0x67466880, 0xb4174831, 0xacf423b2, 0xca815ab3, 0x5a6395e7, 0x302a67c5, 0x8bdb446b, 0x108f8fa4, 0x10223eda,
55 0x92b8b48b, 0x7f38d0ee, 0xab2701d4, 0x0262d415, 0xaf224a30, 0xb3d88aba, 0xf8b2c3af, 0xdaf7ef70, 0xcc97d3b7, 0xe9614b6c,
56 0x2baebff4, 0x70f687cf, 0x386c9156, 0xce092ee5, 0x01e87da6, 0x6ce91e6a, 0xbb7bcc84, 0xc7922c20, 0x9d3b71fd, 0x060e41c6,
57 0xd7590f15, 0x4e03bb47, 0x183c198e, 0x63eeb240, 0x2ddbf49a, 0x6d5cba54, 0x923750af, 0xf9e14236, 0x7838162b, 0x59726c72,
58 0x81b66760, 0xbb2926c1, 0x48a0ce0d, 0xa6c0496d, 0xad43507b, 0x718d496a, 0x9df057af, 0x44b1bde6, 0x054356dc, 0xde7ced35,
59 0xd51a138b, 0x62088cc9, 0x35830311, 0xc96efca2, 0x686f86ec, 0x8e77cb68, 0x63e1d6b8, 0xc80f9778, 0x79c491fd, 0x1b4c67f2,
60 0x58656dfb, 0x50820371, 0x41811896, 0xe337ef7e, 0xd39fb119, 0xc97f0df6, 0x68fea01b, 0xa150a6e5, 0x55258962, 0xeb6ff41b,
61 0xd7c9cd7a, 0xa619cd9e, 0xbcf09576, 0x2672c073, 0xf003fb3c, 0x4ab7a50b, 0x1484126a, 0x487ba9b1, 0xa64fc9c6, 0xf6957d49,
62 0x38b06a75, 0xdd805fcd, 0x63d094cf, 0xf51c999e, 0x1aa4d343, 0xb8495294, 0xce9f8e99, 0xbffcd770, 0xc7c275cc, 0x378453a7,
63 0x7b21be33, 0x397f41bd, 0x4e94d131, 0x92cc1f98, 0x5915ea51, 0x99f861b7, 0xc9980a88, 0x1d74fd5f, 0xb0a495f8, 0x614deed0,
64 0xb5778eea, 0x5941792d, 0xfa90c1f8, 0x33f824b4, 0xc4965372, 0x3ff6d550, 0x4ca5fec0, 0x8630e964, 0x5b3fbbd6, 0x7da26a48,
65 0xb203231a, 0x04297514, 0x2d639306, 0x2eb13149, 0x16a45272, 0x532459a0, 0x8e5f4872, 0xf966c7d9, 0x07128dc0, 0x0d44db62,
66 0xafc8d52d, 0x06316131, 0xd838e7ce, 0x1bc41d00, 0x3a2e8c0f, 0xea83837e, 0xb984737d, 0x13ba4891, 0xc4f8b949, 0xa6d6acb3,
67 0xa215cdce, 0x8359838b, 0x6bd1aa31, 0xf579dd52, 0x21b93f93, 0xf5176781, 0x187dfdde, 0xe94aeb76, 0x2b38fd54, 0x431de1da,
68 0xab394825, 0x9ad3048f, 0xdfea32aa, 0x659473e3, 0x623f7863, 0xf3346c59, 0xab3ab685, 0x3346a90b, 0x6b56443e, 0xc6de01f8,
69 0x8d421fc0, 0x9b0ed10c, 0x88f1a1e9, 0x54c1f029, 0x7dead57b, 0x8d7ba426, 0x4cf5178a, 0x551a7cca, 0x1a9a5f08, 0xfcd651b9,
70 0x25605182, 0xe11fc6c3, 0xb6fd9676, 0x337b3027, 0xb7c8eb14, 0x9e5fd030, 0x6b57e354, 0xad913cf7, 0x7e16688d, 0x58872a69,
71 0x2c2fc7df, 0xe389ccc6, 0x30738df1, 0x0824a734, 0xe1797a8b, 0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, 0x73f9a978, 0x73398d32,
72 0x0f59573e, 0xe9df2b03, 0xe8a5b6c8, 0x848d0704, 0x98df93c2, 0x720a1dc3, 0x684f259a, 0x943ba848, 0xa6370152, 0x863b5ea3,
73 0xd17b978b, 0x6d9b58ef, 0x0a700dd4, 0xa73d36bf, 0x8e6a0829, 0x8695bc14, 0xe35b3447, 0x933ac568, 0x8894b022, 0x2f511c27,
74 0xddfbcc3c, 0x006662b6, 0x117c83fe, 0x4e12b414, 0xc2bca766, 0x3a2fec10, 0xf4562420, 0x55792e2a, 0x46f5d857, 0xceda25ce,
75 0xc3601d3b, 0x6c00ab46, 0xefac9c28, 0xb3c35047, 0x611dfee3, 0x257c3207, 0xfdd58482, 0x3b14d84f, 0x23becb64, 0xa075f3a3,
76 0x088f8ead, 0x07adf158, 0x7796943c, 0xfacabf3d, 0xc09730cd, 0xf7679969, 0xda44e9ed, 0x2c854c12, 0x35935fa3, 0x2f057d9f,
77 0x690624f8, 0x1cb0bafd, 0x7b0dbdc6, 0x810f23bb, 0xfa929a1a, 0x6d969a17, 0x6742979b, 0x74ac7d05, 0x010e65c4, 0x86a3d963,
78 0xf907b5a0, 0xd0042bd3, 0x158d7d03, 0x287a8255, 0xbba8366f, 0x096edc33, 0x21916a7b, 0x77b56b86, 0x951622f9, 0xa6c5e650,
79 0x8cea17d1, 0xcd8c62bc, 0xa3d63433, 0x358a68fd, 0x0f9b9d3c, 0xd6aa295b, 0xfe33384a, 0xc000738e, 0xcd67eb2f, 0xe2eb6dc2,
80 0x97338b02, 0x06c9f246, 0x419cf1ad, 0x2b83c045, 0x3723f18a, 0xcb5b3089, 0x160bead7, 0x5d494656, 0x35f8a74b, 0x1e4e6c9e,
81 0x000399bd, 0x67466880, 0xb4174831, 0xacf423b2, 0xca815ab3, 0x5a6395e7, 0x302a67c5, 0x8bdb446b, 0x108f8fa4, 0x10223eda,
82 0x92b8b48b, 0x7f38d0ee, 0xab2701d4, 0x0262d415, 0xaf224a30, 0xb3d88aba, 0xf8b2c3af, 0xdaf7ef70, 0xcc97d3b7, 0xe9614b6c,
83 0x2baebff4, 0x70f687cf, 0x386c9156, 0xce092ee5, 0x01e87da6, 0x6ce91e6a, 0xbb7bcc84, 0xc7922c20, 0x9d3b71fd, 0x060e41c6,
84 0xd7590f15, 0x4e03bb47, 0x183c198e, 0x63eeb240, 0x2ddbf49a, 0x6d5cba54, 0x923750af, 0xf9e14236, 0x7838162b, 0x59726c72,
85 0x81b66760, 0xbb2926c1, 0x48a0ce0d, 0xa6c0496d, 0xad43507b, 0x718d496a, 0x9df057af, 0x44b1bde6, 0x054356dc, 0xde7ced35,
86 0xd51a138b, 0x62088cc9, 0x35830311, 0xc96efca2, 0x686f86ec, 0x8e77cb68, 0x63e1d6b8, 0xc80f9778, 0x79c491fd, 0x1b4c67f2,
87};
88
89private static int rotl(int val, int pas) {
90 return (val << pas) | (val >>> (32 - pas));
91}
92private static int rotr(int val, int pas) {
93 return (val >>> pas) | (val << (32-pas));
94}
95
96
97private static int[] expandKey(byte[] key){
98 int n = key.length/4;
99 int[] tmp = new int[40];
100 int[] data = new int[n];
101
102 for(int i =0;i<data.length;i++)
103 data[i] = 0;
104
105 int off = 0;
106 for(int i=0;i<data.length;i++){
107 data[i] = ((key[off++]&0xff))|
108 ((key[off++]&0xff) << 8) |
109 ((key[off++]&0xff) << 16) |
110 ((key[off++]&0xff) << 24);
111 }
112
113 int[] T = new int[15];
114 for(int i=0;i<T.length;i++){
115 if(i<data.length) T[i] = data[i];
116 else if(i == data.length) T[i] = n;
117 else T[i] = 0;
118 }
119
120 for(int j=0;j<4;j++){
121 for(int i=0;i<T.length;i++)
122 T[i] = T[i] ^ (rotl(T[Math.abs(i-7 %15)] ^ T[Math.abs(i-2 %15)],3) ^ (4*i+j));
123 for(int c=0;c<4;c++)
124 for(int i=0;i<T.length;i++)
125 T[i] = T[i] + rotl(s_box[(int)(T[Math.abs(i-1%15)] & 0x000001ff)],9);
126 for(int i = 0;i<=9;i++) tmp[10*j+i] = T[4*i%15];
127 }
128
129 int[] B = {0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, 0x73f9a978};
130 int j,w,m,r,p;
131 for(int i = 5;i<=35;i++){
132 j = tmp[i] & 0x00000003;
133 w = tmp[i] | 0x00000003;
134 m = generateMask(w);
135 r = tmp[i-1] & 0x0000001f;
136 p = rotl(B[j],r);
137 tmp[i] = w ^ (p & m);
138 }
139
140 return tmp;
141}
142
143private static int generateMask(int x){
144 int m;
145
146 m = (~x ^ (x>>>1)) & 0x7fffffff;
147 m &= (m >> 1) & (m >> 2);
148 m &= (m >> 3) & (m >> 6);
149
150 if(m == 0)
151 return 0;
152
153 m <<= 1; m |= (m << 1); m |= (m << 2); m |= (m << 4);
154
155 m |= (m << 1) & ~x & 0x80000000;
156
157 return m & 0xfffffffc;
158
159}
160
161
162public static byte[] encryptBloc(byte[] in){
163 byte[] tmp = new byte[in.length];
164 int aux;
165
166
167 int[] data = new int[in.length/4];
168 for(int i =0;i<data.length;i++)
169 data[i] = 0;
170 int off = 0;
171 for(int i=0;i<data.length;i++){
172 data[i] = ((in[off++]&0xff))|
173 ((in[off++]&0xff) << 8) |
174 ((in[off++]&0xff) << 16) |
175 ((in[off++]&0xff) << 24);
176 }
177
178 int A = data[0],B = data[1],C = data[2],D = data[3];
179 A = A + K[0];
180 B = B + K[1];
181 C = C + K[2];
182 D = D + K[3];
183
184 //forward mixing
185 for(int i = 0;i<=7;i++){
186 B = B ^ s_box[A & 0xff];
187 B = B + s_box[(rotr(A,8) & 0xff) + 256];
188 C = C + s_box[rotr(A,16) & 0xff];
189 D = D ^ s_box[(rotr(A,24) & 0xff) + 256];
190
191 A = rotr(A,24);
192
193 if(i == 1 || i == 5) A = A + B;
194 if(i == 0 || i == 4) A = A + D;
195
196 aux = A;
197 A = B;
198 B = C;
199 C = D;
200 D = aux;
201 }
202 int R,L,M;
203 int[] eout;
204 //cryptographic core
205 for(int i = 0;i<=15;i++){
206
207 eout = E_func(A, K[2*i+4], K[2*i+5]);
208
209 A = rotl(A,13);
210 C = C + eout[1];
211
212 if(i<8) {
213 B = B + eout[0];
214 D = D ^ eout[2];
215 }
216 else{
217 D = D + eout[0];
218 B = B ^ eout[2];
219 }
220
221 aux = A;
222 A = B;
223 B = C;
224 C = D;
225 D = aux;
226 }
227 //backward mixing
228 for(int i = 0;i<=7;i++){
229
230 if(i == 3 || i == 7) A = A - B;
231 if(i == 2 || i == 6) A = A - D;
232
233 B = B ^ s_box[(A & 0xff) + 256];
234 C = C - s_box[rotr(A,24) & 0xff];
235 D = D - s_box[(rotr(A,16) & 0xff) + 256];
236 D = D ^ s_box[rotr(A,8) & 0xff];
237
238 A = rotl(A,24);
239
240 aux = A;
241 A = B;
242 B = C;
243 C = D;
244 D = aux;
245
246 }
247 A = A - K[36];
248 B = B - K[37];
249 C = C - K[38];
250 D = D - K[39];
251
252 data[0] = A;data[1] = B;data[2] = C;data[3] = D;
253
254 for(int i = 0;i<tmp.length;i++){
255 tmp[i] = (byte)((data[i/4] >>> (i%4)*8) & 0xff);
256 }
257
258 return tmp;
259}
260
261private static int[] E_func(int in,int k1,int k2){
262 int[] tmp = new int[3];
263 int M,L,R;
264 M = in + k1;
265 R = rotl(in,13) * k2;
266 L = s_box[M & 0x000001ff];
267 R = rotl(R,5);
268 M = rotl(M,R & 0x0000001f);
269 L = L ^ R;
270 R = rotl(R,5);
271 L = L ^ R;
272 L = rotl(L,R & 0x0000001f);
273
274 tmp[0] = L;
275 tmp[1] = M;
276 tmp[2] = R;
277
278 return tmp;
279}
280
281public static byte[] encrypt(byte[] in,byte[] key){
282 K = expandKey(key);
283 int lenght=0;
284 byte[] padding = new byte[1];
285 int i;
286 lenght = 16 - in.length % 16;
287 padding = new byte[lenght];
288 padding[0] = (byte) 0x80;
289
290 for (i = 1; i < lenght; i++)
291 padding[i] = 0;
292
293 byte[] tmp = new byte[in.length + lenght];
294 byte[] bloc = new byte[16];
295
296 int count = 0;
297
298 for (i = 0; i < in.length + lenght; i++) {
299 if (i > 0 && i % 16 == 0) {
300 bloc = encryptBloc(bloc);
301 System.arraycopy(bloc, 0, tmp, i - 16, bloc.length);
302 }
303 if (i < in.length)
304 bloc[i % 16] = in[i];
305 else{
306 bloc[i % 16] = padding[count % 16];
307 count++;
308 }
309 }
310 if(bloc.length == 16){
311 bloc = encryptBloc(bloc);
312 System.arraycopy(bloc, 0, tmp, i - 16, bloc.length);
313 }
314
315 return tmp;
316}
317
318
319private static byte[] deletePadding(byte[] input) {
320 int count = 0;
321
322 int i = input.length - 1;
323 while (input[i] == 0) {
324 count++;
325 i--;
326 }
327
328 byte[] tmp = new byte[input.length - count - 1];
329 System.arraycopy(input, 0, tmp, 0, tmp.length);
330 return tmp;
331
332 }
333
334public static void main(String[] args) throws Exception {
335 KeyGenerator kgen = KeyGenerator.getInstance("AES");
336 kgen.init(128);
337
338 // Generate the secret key specs.
339 SecretKey skey = kgen.generateKey();
340 byte[] raw = skey.getEncoded();
341
342 BufferedReader userInput = new BufferedReader
343 (new InputStreamReader(System.in));
344 String plainText = userInput.readLine();
345 System.out.println("Plain Text Before Encryption: " + plainText);
346
347
348 }
349 public static String encrypt(String plainText, SecretKey secretKey, SecretKey SecretKey)
350 throws Exception {
351 byte[] plainTextByte = plainText.getBytes();
352 cipher.init(Cipher.ENCRYPT_MODE, secretKey);
353 byte[] encryptedByte = cipher.doFinal(plainTextByte);
354 Base64.Encoder encoder = Base64.getEncoder();
355 String encrypt = encoder.encodeToString(encryptedByte);
356 System.out.println("Encrypted Text After Encryption: " + encrypt);
357 return encrypt;
358
359 }
360
361}