@@ -242,26 +242,38 @@ public static BigInteger[] keyExpansion(BigInteger initialKey) {
242242 new BigInteger ("0" ), new BigInteger ("0" ), new BigInteger ("0" ), new BigInteger ("0" ), new BigInteger ("0" ),
243243 new BigInteger ("0" ), new BigInteger ("0" ), };
244244
245+ // initialize rcon iteration
246+ int rconCounter = 1 ;
247+
245248 for (int i = 1 ; i < 11 ; i ++) {
246249
247250 // get the previous 32 bits the key
248251 BigInteger t = roundKeys [i - 1 ].remainder (new BigInteger ("100000000" , 16 ));
249-
250- // initialize rcon iteration
251- int rconCounter = 1 ;
252-
253- // schedule core
252+
253+ // split previous key into 8-bit segments
254+ BigInteger [] prevKey = {
255+ roundKeys [i - 1 ].remainder (new BigInteger ("100000000" , 16 )),
256+ roundKeys [i - 1 ].remainder (new BigInteger ("10000000000000000" , 16 )).divide (new BigInteger ("100000000" , 16 )),
257+ roundKeys [i - 1 ].remainder (new BigInteger ("1000000000000000000000000" , 16 )).divide (new BigInteger ("10000000000000000" , 16 )),
258+ roundKeys [i - 1 ].divide (new BigInteger ("1000000000000000000000000" , 16 )),
259+ };
260+
261+ // run schedule core
254262 t = scheduleCore (t , rconCounter );
255263 rconCounter += 1 ;
256- BigInteger t1 = t .multiply (new BigInteger ("100000000" , 16 ));
257- BigInteger t2 = t .multiply (new BigInteger ("10000000000000000" , 16 ));
258- BigInteger t3 = t .multiply (new BigInteger ("1000000000000000000000000" , 16 ));
259- t = t .add (t1 ).add (t2 ).add (t3 );
264+
265+ // Calculate partial round key
266+ BigInteger t0 = t .xor (prevKey [3 ]);
267+ BigInteger t1 = t0 .xor (prevKey [2 ]);
268+ BigInteger t2 = t1 .xor (prevKey [1 ]);
269+ BigInteger t3 = t2 .xor (prevKey [0 ]);
270+
271+ // Join round key segments
272+ t2 = t2 .multiply (new BigInteger ("100000000" , 16 ));
273+ t1 = t1 .multiply (new BigInteger ("10000000000000000" , 16 ));
274+ t0 = t0 .multiply (new BigInteger ("1000000000000000000000000" , 16 ));
275+ roundKeys [i ] = t0 .add (t1 ).add (t2 ).add (t3 );
260276
261- BigInteger xorMask = roundKeys [i - 1 ].divide (new BigInteger ("100000000" , 16 ));
262- xorMask = xorMask .multiply (new BigInteger ("100000000" , 16 ));
263- t = t .xor (xorMask );
264- roundKeys [i ] = t ;
265277
266278 }
267279 return roundKeys ;
@@ -511,11 +523,13 @@ public static BigInteger decrypt(BigInteger ciphertext, BigInteger key) {
511523 public static void main (String [] args ) {
512524
513525 boolean encrypt = false ;
514- BigInteger key = new BigInteger ("f0f1f2f3f4f5f6f708090a0b0c0d0e0f " , 16 );
526+ BigInteger key = new BigInteger ("0 " , 16 );
515527 BigInteger plaintext = new BigInteger ("0" , 16 );
516528 BigInteger ciphertext = new BigInteger ("adcfc0ed15292419cb796167bc02b669" , 16 );
517529 BigInteger output ;
518530
531+ System .out .println (keyExpansion (key )[2 ].xor (new BigInteger ("9b9898c9f9fbfbaa9b9898c9f9fbfbaa" ,16 )).toString (16 ));
532+
519533 if (encrypt ) {
520534 output = encrypt (plaintext , key );
521535 } else {
0 commit comments