| /* |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| */ |
| |
| |
| /* AES Encryption */ |
| |
| |
| public class AES { |
| int mode; |
| private int[] fkey=new int[44]; |
| private int[] rkey=new int[44]; |
| public byte[] f=new byte[16]; |
| |
| |
| public static final int ECB=0; |
| public static final int CBC=1; |
| public static final int CFB1=2; |
| public static final int CFB2=3; |
| public static final int CFB4=5; |
| public static final int OFB1=14; |
| public static final int OFB2=15; |
| public static final int OFB4=17; |
| public static final int OFB8=21; |
| public static final int OFB16=29; |
| |
| private static final byte[] InCo={(byte)0xB,(byte)0xD,(byte)0x9,(byte)0xE}; /* Inverse Coefficients */ |
| |
| public static final int KS=16; /* Key Size in bytes */ |
| public static final int BS=16; /* Block Size */ |
| |
| private static final byte[] ptab= |
| {(byte)1,(byte)3,(byte)5,(byte)15,(byte)17,(byte)51,(byte)85,(byte)255,(byte)26,(byte)46,(byte)114,(byte)150,(byte)161,(byte)248,(byte)19,(byte)53, |
| (byte)95,(byte)225,(byte)56,(byte)72,(byte)216,(byte)115,(byte)149,(byte)164,(byte)247,(byte)2,(byte)6,(byte)10,(byte)30,(byte)34,(byte)102,(byte)170, |
| (byte)229,(byte)52,(byte)92,(byte)228,(byte)55,(byte)89,(byte)235,(byte)38,(byte)106,(byte)190,(byte)217,(byte)112,(byte)144,(byte)171,(byte)230,(byte)49, |
| (byte)83,(byte)245,(byte)4,(byte)12,(byte)20,(byte)60,(byte)68,(byte)204,(byte)79,(byte)209,(byte)104,(byte)184,(byte)211,(byte)110,(byte)178,(byte)205, |
| (byte)76,(byte)212,(byte)103,(byte)169,(byte)224,(byte)59,(byte)77,(byte)215,(byte)98,(byte)166,(byte)241,(byte)8,(byte)24,(byte)40,(byte)120,(byte)136, |
| (byte)131,(byte)158,(byte)185,(byte)208,(byte)107,(byte)189,(byte)220,(byte)127,(byte)129,(byte)152,(byte)179,(byte)206,(byte)73,(byte)219,(byte)118,(byte)154, |
| (byte)181,(byte)196,(byte)87,(byte)249,(byte)16,(byte)48,(byte)80,(byte)240,(byte)11,(byte)29,(byte)39,(byte)105,(byte)187,(byte)214,(byte)97,(byte)163, |
| (byte)254,(byte)25,(byte)43,(byte)125,(byte)135,(byte)146,(byte)173,(byte)236,(byte)47,(byte)113,(byte)147,(byte)174,(byte)233,(byte)32,(byte)96,(byte)160, |
| (byte)251,(byte)22,(byte)58,(byte)78,(byte)210,(byte)109,(byte)183,(byte)194,(byte)93,(byte)231,(byte)50,(byte)86,(byte)250,(byte)21,(byte)63,(byte)65, |
| (byte)195,(byte)94,(byte)226,(byte)61,(byte)71,(byte)201,(byte)64,(byte)192,(byte)91,(byte)237,(byte)44,(byte)116,(byte)156,(byte)191,(byte)218,(byte)117, |
| (byte)159,(byte)186,(byte)213,(byte)100,(byte)172,(byte)239,(byte)42,(byte)126,(byte)130,(byte)157,(byte)188,(byte)223,(byte)122,(byte)142,(byte)137,(byte)128, |
| (byte)155,(byte)182,(byte)193,(byte)88,(byte)232,(byte)35,(byte)101,(byte)175,(byte)234,(byte)37,(byte)111,(byte)177,(byte)200,(byte)67,(byte)197,(byte)84, |
| (byte)252,(byte)31,(byte)33,(byte)99,(byte)165,(byte)244,(byte)7,(byte)9,(byte)27,(byte)45,(byte)119,(byte)153,(byte)176,(byte)203,(byte)70,(byte)202, |
| (byte)69,(byte)207,(byte)74,(byte)222,(byte)121,(byte)139,(byte)134,(byte)145,(byte)168,(byte)227,(byte)62,(byte)66,(byte)198,(byte)81,(byte)243,(byte)14, |
| (byte)18,(byte)54,(byte)90,(byte)238,(byte)41,(byte)123,(byte)141,(byte)140,(byte)143,(byte)138,(byte)133,(byte)148,(byte)167,(byte)242,(byte)13,(byte)23, |
| (byte)57,(byte)75,(byte)221,(byte)124,(byte)132,(byte)151,(byte)162,(byte)253,(byte)28,(byte)36,(byte)108,(byte)180,(byte)199,(byte)82,(byte)246,(byte)1}; |
| |
| private static final byte[] ltab= |
| {(byte)0,(byte)255,(byte)25,(byte)1,(byte)50,(byte)2,(byte)26,(byte)198,(byte)75,(byte)199,(byte)27,(byte)104,(byte)51,(byte)238,(byte)223,(byte)3, |
| (byte)100,(byte)4,(byte)224,(byte)14,(byte)52,(byte)141,(byte)129,(byte)239,(byte)76,(byte)113,(byte)8,(byte)200,(byte)248,(byte)105,(byte)28,(byte)193, |
| (byte)125,(byte)194,(byte)29,(byte)181,(byte)249,(byte)185,(byte)39,(byte)106,(byte)77,(byte)228,(byte)166,(byte)114,(byte)154,(byte)201,(byte)9,(byte)120, |
| (byte)101,(byte)47,(byte)138,(byte)5,(byte)33,(byte)15,(byte)225,(byte)36,(byte)18,(byte)240,(byte)130,(byte)69,(byte)53,(byte)147,(byte)218,(byte)142, |
| (byte)150,(byte)143,(byte)219,(byte)189,(byte)54,(byte)208,(byte)206,(byte)148,(byte)19,(byte)92,(byte)210,(byte)241,(byte)64,(byte)70,(byte)131,(byte)56, |
| (byte)102,(byte)221,(byte)253,(byte)48,(byte)191,(byte)6,(byte)139,(byte)98,(byte)179,(byte)37,(byte)226,(byte)152,(byte)34,(byte)136,(byte)145,(byte)16, |
| (byte)126,(byte)110,(byte)72,(byte)195,(byte)163,(byte)182,(byte)30,(byte)66,(byte)58,(byte)107,(byte)40,(byte)84,(byte)250,(byte)133,(byte)61,(byte)186, |
| (byte)43,(byte)121,(byte)10,(byte)21,(byte)155,(byte)159,(byte)94,(byte)202,(byte)78,(byte)212,(byte)172,(byte)229,(byte)243,(byte)115,(byte)167,(byte)87, |
| (byte)175,(byte)88,(byte)168,(byte)80,(byte)244,(byte)234,(byte)214,(byte)116,(byte)79,(byte)174,(byte)233,(byte)213,(byte)231,(byte)230,(byte)173,(byte)232, |
| (byte)44,(byte)215,(byte)117,(byte)122,(byte)235,(byte)22,(byte)11,(byte)245,(byte)89,(byte)203,(byte)95,(byte)176,(byte)156,(byte)169,(byte)81,(byte)160, |
| (byte)127,(byte)12,(byte)246,(byte)111,(byte)23,(byte)196,(byte)73,(byte)236,(byte)216,(byte)67,(byte)31,(byte)45,(byte)164,(byte)118,(byte)123,(byte)183, |
| (byte)204,(byte)187,(byte)62,(byte)90,(byte)251,(byte)96,(byte)177,(byte)134,(byte)59,(byte)82,(byte)161,(byte)108,(byte)170,(byte)85,(byte)41,(byte)157, |
| (byte)151,(byte)178,(byte)135,(byte)144,(byte)97,(byte)190,(byte)220,(byte)252,(byte)188,(byte)149,(byte)207,(byte)205,(byte)55,(byte)63,(byte)91,(byte)209, |
| (byte)83,(byte)57,(byte)132,(byte)60,(byte)65,(byte)162,(byte)109,(byte)71,(byte)20,(byte)42,(byte)158,(byte)93,(byte)86,(byte)242,(byte)211,(byte)171, |
| (byte)68,(byte)17,(byte)146,(byte)217,(byte)35,(byte)32,(byte)46,(byte)137,(byte)180,(byte)124,(byte)184,(byte)38,(byte)119,(byte)153,(byte)227,(byte)165, |
| (byte)103,(byte)74,(byte)237,(byte)222,(byte)197,(byte)49,(byte)254,(byte)24,(byte)13,(byte)99,(byte)140,(byte)128,(byte)192,(byte)247,(byte)112,(byte)7}; |
| |
| private static final byte[] fbsub= |
| {(byte)99,(byte)124,(byte)119,(byte)123,(byte)242,(byte)107,(byte)111,(byte)197,(byte)48,(byte)1,(byte)103,(byte)43,(byte)254,(byte)215,(byte)171,(byte)118, |
| (byte)202,(byte)130,(byte)201,(byte)125,(byte)250,(byte)89,(byte)71,(byte)240,(byte)173,(byte)212,(byte)162,(byte)175,(byte)156,(byte)164,(byte)114,(byte)192, |
| (byte)183,(byte)253,(byte)147,(byte)38,(byte)54,(byte)63,(byte)247,(byte)204,(byte)52,(byte)165,(byte)229,(byte)241,(byte)113,(byte)216,(byte)49,(byte)21, |
| (byte)4,(byte)199,(byte)35,(byte)195,(byte)24,(byte)150,(byte)5,(byte)154,(byte)7,(byte)18,(byte)128,(byte)226,(byte)235,(byte)39,(byte)178,(byte)117, |
| (byte)9,(byte)131,(byte)44,(byte)26,(byte)27,(byte)110,(byte)90,(byte)160,(byte)82,(byte)59,(byte)214,(byte)179,(byte)41,(byte)227,(byte)47,(byte)132, |
| (byte)83,(byte)209,(byte)0,(byte)237,(byte)32,(byte)252,(byte)177,(byte)91,(byte)106,(byte)203,(byte)190,(byte)57,(byte)74,(byte)76,(byte)88,(byte)207, |
| (byte)208,(byte)239,(byte)170,(byte)251,(byte)67,(byte)77,(byte)51,(byte)133,(byte)69,(byte)249,(byte)2,(byte)127,(byte)80,(byte)60,(byte)159,(byte)168, |
| (byte)81,(byte)163,(byte)64,(byte)143,(byte)146,(byte)157,(byte)56,(byte)245,(byte)188,(byte)182,(byte)218,(byte)33,(byte)16,(byte)255,(byte)243,(byte)210, |
| (byte)205,(byte)12,(byte)19,(byte)236,(byte)95,(byte)151,(byte)68,(byte)23,(byte)196,(byte)167,(byte)126,(byte)61,(byte)100,(byte)93,(byte)25,(byte)115, |
| (byte)96,(byte)129,(byte)79,(byte)220,(byte)34,(byte)42,(byte)144,(byte)136,(byte)70,(byte)238,(byte)184,(byte)20,(byte)222,(byte)94,(byte)11,(byte)219, |
| (byte)224,(byte)50,(byte)58,(byte)10,(byte)73,(byte)6,(byte)36,(byte)92,(byte)194,(byte)211,(byte)172,(byte)98,(byte)145,(byte)149,(byte)228,(byte)121, |
| (byte)231,(byte)200,(byte)55,(byte)109,(byte)141,(byte)213,(byte)78,(byte)169,(byte)108,(byte)86,(byte)244,(byte)234,(byte)101,(byte)122,(byte)174,(byte)8, |
| (byte)186,(byte)120,(byte)37,(byte)46,(byte)28,(byte)166,(byte)180,(byte)198,(byte)232,(byte)221,(byte)116,(byte)31,(byte)75,(byte)189,(byte)139,(byte)138, |
| (byte)112,(byte)62,(byte)181,(byte)102,(byte)72,(byte)3,(byte)246,(byte)14,(byte)97,(byte)53,(byte)87,(byte)185,(byte)134,(byte)193,(byte)29,(byte)158, |
| (byte)225,(byte)248,(byte)152,(byte)17,(byte)105,(byte)217,(byte)142,(byte)148,(byte)155,(byte)30,(byte)135,(byte)233,(byte)206,(byte)85,(byte)40,(byte)223, |
| (byte)140,(byte)161,(byte)137,(byte)13,(byte)191,(byte)230,(byte)66,(byte)104,(byte)65,(byte)153,(byte)45,(byte)15,(byte)176,(byte)84,(byte)187,(byte)22}; |
| |
| private static final byte[] rbsub= |
| {(byte)82,(byte)9,(byte)106,(byte)213,(byte)48,(byte)54,(byte)165,(byte)56,(byte)191,(byte)64,(byte)163,(byte)158,(byte)129,(byte)243,(byte)215,(byte)251, |
| (byte)124,(byte)227,(byte)57,(byte)130,(byte)155,(byte)47,(byte)255,(byte)135,(byte)52,(byte)142,(byte)67,(byte)68,(byte)196,(byte)222,(byte)233,(byte)203, |
| (byte)84,(byte)123,(byte)148,(byte)50,(byte)166,(byte)194,(byte)35,(byte)61,(byte)238,(byte)76,(byte)149,(byte)11,(byte)66,(byte)250,(byte)195,(byte)78, |
| (byte)8,(byte)46,(byte)161,(byte)102,(byte)40,(byte)217,(byte)36,(byte)178,(byte)118,(byte)91,(byte)162,(byte)73,(byte)109,(byte)139,(byte)209,(byte)37, |
| (byte)114,(byte)248,(byte)246,(byte)100,(byte)134,(byte)104,(byte)152,(byte)22,(byte)212,(byte)164,(byte)92,(byte)204,(byte)93,(byte)101,(byte)182,(byte)146, |
| (byte)108,(byte)112,(byte)72,(byte)80,(byte)253,(byte)237,(byte)185,(byte)218,(byte)94,(byte)21,(byte)70,(byte)87,(byte)167,(byte)141,(byte)157,(byte)132, |
| (byte)144,(byte)216,(byte)171,(byte)0,(byte)140,(byte)188,(byte)211,(byte)10,(byte)247,(byte)228,(byte)88,(byte)5,(byte)184,(byte)179,(byte)69,(byte)6, |
| (byte)208,(byte)44,(byte)30,(byte)143,(byte)202,(byte)63,(byte)15,(byte)2,(byte)193,(byte)175,(byte)189,(byte)3,(byte)1,(byte)19,(byte)138,(byte)107, |
| (byte)58,(byte)145,(byte)17,(byte)65,(byte)79,(byte)103,(byte)220,(byte)234,(byte)151,(byte)242,(byte)207,(byte)206,(byte)240,(byte)180,(byte)230,(byte)115, |
| (byte)150,(byte)172,(byte)116,(byte)34,(byte)231,(byte)173,(byte)53,(byte)133,(byte)226,(byte)249,(byte)55,(byte)232,(byte)28,(byte)117,(byte)223,(byte)110, |
| (byte)71,(byte)241,(byte)26,(byte)113,(byte)29,(byte)41,(byte)197,(byte)137,(byte)111,(byte)183,(byte)98,(byte)14,(byte)170,(byte)24,(byte)190,(byte)27, |
| (byte)252,(byte)86,(byte)62,(byte)75,(byte)198,(byte)210,(byte)121,(byte)32,(byte)154,(byte)219,(byte)192,(byte)254,(byte)120,(byte)205,(byte)90,(byte)244, |
| (byte)31,(byte)221,(byte)168,(byte)51,(byte)136,(byte)7,(byte)199,(byte)49,(byte)177,(byte)18,(byte)16,(byte)89,(byte)39,(byte)128,(byte)236,(byte)95, |
| (byte)96,(byte)81,(byte)127,(byte)169,(byte)25,(byte)181,(byte)74,(byte)13,(byte)45,(byte)229,(byte)122,(byte)159,(byte)147,(byte)201,(byte)156,(byte)239, |
| (byte)160,(byte)224,(byte)59,(byte)77,(byte)174,(byte)42,(byte)245,(byte)176,(byte)200,(byte)235,(byte)187,(byte)60,(byte)131,(byte)83,(byte)153,(byte)97, |
| (byte)23,(byte)43,(byte)4,(byte)126,(byte)186,(byte)119,(byte)214,(byte)38,(byte)225,(byte)105,(byte)20,(byte)99,(byte)85,(byte)33,(byte)12,(byte)125}; |
| |
| private static final byte[] rco= |
| {(byte)1,(byte)2,(byte)4,(byte)8,(byte)16,(byte)32,(byte)64,(byte)128,(byte)27,(byte)54,(byte)108,(byte)216,(byte)171,(byte)77,(byte)154,(byte)47}; |
| |
| private static final int[] ftable= |
| {0xa56363c6,0x847c7cf8,0x997777ee,0x8d7b7bf6,0xdf2f2ff,0xbd6b6bd6, |
| 0xb16f6fde,0x54c5c591,0x50303060,0x3010102,0xa96767ce,0x7d2b2b56, |
| 0x19fefee7,0x62d7d7b5,0xe6abab4d,0x9a7676ec,0x45caca8f,0x9d82821f, |
| 0x40c9c989,0x877d7dfa,0x15fafaef,0xeb5959b2,0xc947478e,0xbf0f0fb, |
| 0xecadad41,0x67d4d4b3,0xfda2a25f,0xeaafaf45,0xbf9c9c23,0xf7a4a453, |
| 0x967272e4,0x5bc0c09b,0xc2b7b775,0x1cfdfde1,0xae93933d,0x6a26264c, |
| 0x5a36366c,0x413f3f7e,0x2f7f7f5,0x4fcccc83,0x5c343468,0xf4a5a551, |
| 0x34e5e5d1,0x8f1f1f9,0x937171e2,0x73d8d8ab,0x53313162,0x3f15152a, |
| 0xc040408,0x52c7c795,0x65232346,0x5ec3c39d,0x28181830,0xa1969637, |
| 0xf05050a,0xb59a9a2f,0x907070e,0x36121224,0x9b80801b,0x3de2e2df, |
| 0x26ebebcd,0x6927274e,0xcdb2b27f,0x9f7575ea,0x1b090912,0x9e83831d, |
| 0x742c2c58,0x2e1a1a34,0x2d1b1b36,0xb26e6edc,0xee5a5ab4,0xfba0a05b, |
| 0xf65252a4,0x4d3b3b76,0x61d6d6b7,0xceb3b37d,0x7b292952,0x3ee3e3dd, |
| 0x712f2f5e,0x97848413,0xf55353a6,0x68d1d1b9,0x0,0x2cededc1, |
| 0x60202040,0x1ffcfce3,0xc8b1b179,0xed5b5bb6,0xbe6a6ad4,0x46cbcb8d, |
| 0xd9bebe67,0x4b393972,0xde4a4a94,0xd44c4c98,0xe85858b0,0x4acfcf85, |
| 0x6bd0d0bb,0x2aefefc5,0xe5aaaa4f,0x16fbfbed,0xc5434386,0xd74d4d9a, |
| 0x55333366,0x94858511,0xcf45458a,0x10f9f9e9,0x6020204,0x817f7ffe, |
| 0xf05050a0,0x443c3c78,0xba9f9f25,0xe3a8a84b,0xf35151a2,0xfea3a35d, |
| 0xc0404080,0x8a8f8f05,0xad92923f,0xbc9d9d21,0x48383870,0x4f5f5f1, |
| 0xdfbcbc63,0xc1b6b677,0x75dadaaf,0x63212142,0x30101020,0x1affffe5, |
| 0xef3f3fd,0x6dd2d2bf,0x4ccdcd81,0x140c0c18,0x35131326,0x2fececc3, |
| 0xe15f5fbe,0xa2979735,0xcc444488,0x3917172e,0x57c4c493,0xf2a7a755, |
| 0x827e7efc,0x473d3d7a,0xac6464c8,0xe75d5dba,0x2b191932,0x957373e6, |
| 0xa06060c0,0x98818119,0xd14f4f9e,0x7fdcdca3,0x66222244,0x7e2a2a54, |
| 0xab90903b,0x8388880b,0xca46468c,0x29eeeec7,0xd3b8b86b,0x3c141428, |
| 0x79dedea7,0xe25e5ebc,0x1d0b0b16,0x76dbdbad,0x3be0e0db,0x56323264, |
| 0x4e3a3a74,0x1e0a0a14,0xdb494992,0xa06060c,0x6c242448,0xe45c5cb8, |
| 0x5dc2c29f,0x6ed3d3bd,0xefacac43,0xa66262c4,0xa8919139,0xa4959531, |
| 0x37e4e4d3,0x8b7979f2,0x32e7e7d5,0x43c8c88b,0x5937376e,0xb76d6dda, |
| 0x8c8d8d01,0x64d5d5b1,0xd24e4e9c,0xe0a9a949,0xb46c6cd8,0xfa5656ac, |
| 0x7f4f4f3,0x25eaeacf,0xaf6565ca,0x8e7a7af4,0xe9aeae47,0x18080810, |
| 0xd5baba6f,0x887878f0,0x6f25254a,0x722e2e5c,0x241c1c38,0xf1a6a657, |
| 0xc7b4b473,0x51c6c697,0x23e8e8cb,0x7cdddda1,0x9c7474e8,0x211f1f3e, |
| 0xdd4b4b96,0xdcbdbd61,0x868b8b0d,0x858a8a0f,0x907070e0,0x423e3e7c, |
| 0xc4b5b571,0xaa6666cc,0xd8484890,0x5030306,0x1f6f6f7,0x120e0e1c, |
| 0xa36161c2,0x5f35356a,0xf95757ae,0xd0b9b969,0x91868617,0x58c1c199, |
| 0x271d1d3a,0xb99e9e27,0x38e1e1d9,0x13f8f8eb,0xb398982b,0x33111122, |
| 0xbb6969d2,0x70d9d9a9,0x898e8e07,0xa7949433,0xb69b9b2d,0x221e1e3c, |
| 0x92878715,0x20e9e9c9,0x49cece87,0xff5555aa,0x78282850,0x7adfdfa5, |
| 0x8f8c8c03,0xf8a1a159,0x80898909,0x170d0d1a,0xdabfbf65,0x31e6e6d7, |
| 0xc6424284,0xb86868d0,0xc3414182,0xb0999929,0x772d2d5a,0x110f0f1e, |
| 0xcbb0b07b,0xfc5454a8,0xd6bbbb6d,0x3a16162c}; |
| |
| private static final int[] rtable= |
| {0x50a7f451,0x5365417e,0xc3a4171a,0x965e273a,0xcb6bab3b,0xf1459d1f, |
| 0xab58faac,0x9303e34b,0x55fa3020,0xf66d76ad,0x9176cc88,0x254c02f5, |
| 0xfcd7e54f,0xd7cb2ac5,0x80443526,0x8fa362b5,0x495ab1de,0x671bba25, |
| 0x980eea45,0xe1c0fe5d,0x2752fc3,0x12f04c81,0xa397468d,0xc6f9d36b, |
| 0xe75f8f03,0x959c9215,0xeb7a6dbf,0xda595295,0x2d83bed4,0xd3217458, |
| 0x2969e049,0x44c8c98e,0x6a89c275,0x78798ef4,0x6b3e5899,0xdd71b927, |
| 0xb64fe1be,0x17ad88f0,0x66ac20c9,0xb43ace7d,0x184adf63,0x82311ae5, |
| 0x60335197,0x457f5362,0xe07764b1,0x84ae6bbb,0x1ca081fe,0x942b08f9, |
| 0x58684870,0x19fd458f,0x876cde94,0xb7f87b52,0x23d373ab,0xe2024b72, |
| 0x578f1fe3,0x2aab5566,0x728ebb2,0x3c2b52f,0x9a7bc586,0xa50837d3, |
| 0xf2872830,0xb2a5bf23,0xba6a0302,0x5c8216ed,0x2b1ccf8a,0x92b479a7, |
| 0xf0f207f3,0xa1e2694e,0xcdf4da65,0xd5be0506,0x1f6234d1,0x8afea6c4, |
| 0x9d532e34,0xa055f3a2,0x32e18a05,0x75ebf6a4,0x39ec830b,0xaaef6040, |
| 0x69f715e,0x51106ebd,0xf98a213e,0x3d06dd96,0xae053edd,0x46bde64d, |
| 0xb58d5491,0x55dc471,0x6fd40604,0xff155060,0x24fb9819,0x97e9bdd6, |
| 0xcc434089,0x779ed967,0xbd42e8b0,0x888b8907,0x385b19e7,0xdbeec879, |
| 0x470a7ca1,0xe90f427c,0xc91e84f8,0x0,0x83868009,0x48ed2b32, |
| 0xac70111e,0x4e725a6c,0xfbff0efd,0x5638850f,0x1ed5ae3d,0x27392d36, |
| 0x64d90f0a,0x21a65c68,0xd1545b9b,0x3a2e3624,0xb1670a0c,0xfe75793, |
| 0xd296eeb4,0x9e919b1b,0x4fc5c080,0xa220dc61,0x694b775a,0x161a121c, |
| 0xaba93e2,0xe52aa0c0,0x43e0223c,0x1d171b12,0xb0d090e,0xadc78bf2, |
| 0xb9a8b62d,0xc8a91e14,0x8519f157,0x4c0775af,0xbbdd99ee,0xfd607fa3, |
| 0x9f2601f7,0xbcf5725c,0xc53b6644,0x347efb5b,0x7629438b,0xdcc623cb, |
| 0x68fcedb6,0x63f1e4b8,0xcadc31d7,0x10856342,0x40229713,0x2011c684, |
| 0x7d244a85,0xf83dbbd2,0x1132f9ae,0x6da129c7,0x4b2f9e1d,0xf330b2dc, |
| 0xec52860d,0xd0e3c177,0x6c16b32b,0x99b970a9,0xfa489411,0x2264e947, |
| 0xc48cfca8,0x1a3ff0a0,0xd82c7d56,0xef903322,0xc74e4987,0xc1d138d9, |
| 0xfea2ca8c,0x360bd498,0xcf81f5a6,0x28de7aa5,0x268eb7da,0xa4bfad3f, |
| 0xe49d3a2c,0xd927850,0x9bcc5f6a,0x62467e54,0xc2138df6,0xe8b8d890, |
| 0x5ef7392e,0xf5afc382,0xbe805d9f,0x7c93d069,0xa92dd56f,0xb31225cf, |
| 0x3b99acc8,0xa77d1810,0x6e639ce8,0x7bbb3bdb,0x97826cd,0xf418596e, |
| 0x1b79aec,0xa89a4f83,0x656e95e6,0x7ee6ffaa,0x8cfbc21,0xe6e815ef, |
| 0xd99be7ba,0xce366f4a,0xd4099fea,0xd67cb029,0xafb2a431,0x31233f2a, |
| 0x3094a5c6,0xc066a235,0x37bc4e74,0xa6ca82fc,0xb0d090e0,0x15d8a733, |
| 0x4a9804f1,0xf7daec41,0xe50cd7f,0x2ff69117,0x8dd64d76,0x4db0ef43, |
| 0x544daacc,0xdf0496e4,0xe3b5d19e,0x1b886a4c,0xb81f2cc1,0x7f516546, |
| 0x4ea5e9d,0x5d358c01,0x737487fa,0x2e410bfb,0x5a1d67b3,0x52d2db92, |
| 0x335610e9,0x1347d66d,0x8c61d79a,0x7a0ca137,0x8e14f859,0x893c13eb, |
| 0xee27a9ce,0x35c961b7,0xede51ce1,0x3cb1477a,0x59dfd29c,0x3f73f255, |
| 0x79ce1418,0xbf37c773,0xeacdf753,0x5baafd5f,0x146f3ddf,0x86db4478, |
| 0x81f3afca,0x3ec468b9,0x2c342438,0x5f40a3c2,0x72c31d16,0xc25e2bc, |
| 0x8b493c28,0x41950dff,0x7101a839,0xdeb30c08,0x9ce4b4d8,0x90c15664, |
| 0x6184cb7b,0x70b632d5,0x745c6c48,0x4257b8d0}; |
| |
| |
| /* Rotates 32-bit word left by 1, 2 or 3 byte */ |
| |
| private static int ROTL8(int x) |
| { |
| return (((x)<<8)|((x)>>>24)); |
| } |
| |
| private static int ROTL16(int x) |
| { |
| return (((x)<<16)|((x)>>>16)); |
| } |
| |
| private static int ROTL24(int x) |
| { |
| return (((x)<<24)|((x)>>>8)); |
| } |
| |
| private static int pack(byte[] b) |
| { /* pack bytes into a 32-bit Word */ |
| return ((((int)b[3])&0xff)<<24)|(((int)b[2]&0xff)<<16)|(((int)b[1]&0xff)<<8)|((int)b[0]&0xff); |
| } |
| |
| private static byte[] unpack(int a) |
| { /* unpack bytes from a word */ |
| byte [] b=new byte[4]; |
| b[0]=(byte)(a); |
| b[1]=(byte)(a>>>8); |
| b[2]=(byte)(a>>>16); |
| b[3]=(byte)(a>>>24); |
| return b; |
| } |
| |
| private static byte bmul(byte x,byte y) |
| { /* x.y= AntiLog(Log(x) + Log(y)) */ |
| |
| int ix=((int)x)&0xff; |
| int iy=((int)y)&0xff; |
| int lx=((int)ltab[ix])&0xff; |
| int ly=((int)ltab[iy])&0xff; |
| if (x!=0 && y!=0) return ptab[(lx+ly)%255]; |
| else return (byte)0; |
| } |
| |
| // if (x && y) |
| |
| private static int SubByte(int a) |
| { |
| byte [] b=unpack(a); |
| b[0]=fbsub[(int)b[0]&0xff]; |
| b[1]=fbsub[(int)b[1]&0xff]; |
| b[2]=fbsub[(int)b[2]&0xff]; |
| b[3]=fbsub[(int)b[3]&0xff]; |
| return pack(b); |
| } |
| |
| private static byte product(int x,int y) |
| { /* dot product of two 4-byte arrays */ |
| byte [] xb;//=new byte[4]; |
| byte [] yb;//=new byte[4]; |
| xb=unpack(x); |
| yb=unpack(y); |
| |
| return (byte)(bmul(xb[0],yb[0])^bmul(xb[1],yb[1])^bmul(xb[2],yb[2])^bmul(xb[3],yb[3])); |
| } |
| |
| private static int InvMixCol(int x) |
| { /* matrix Multiplication */ |
| int y,m; |
| byte [] b=new byte[4]; |
| |
| m=pack(InCo); |
| b[3]=product(m,x); |
| m=ROTL24(m); |
| b[2]=product(m,x); |
| m=ROTL24(m); |
| b[1]=product(m,x); |
| m=ROTL24(m); |
| b[0]=product(m,x); |
| y=pack(b); |
| return y; |
| } |
| |
| /* reset cipher */ |
| public void reset(int m,byte[] iv) |
| { /* reset mode, or reset iv */ |
| mode=m; |
| for (int i=0;i<16;i++) |
| f[i]=0; |
| if (mode!=ECB && iv!=null) |
| for (int i=0;i<16;i++) |
| f[i]=iv[i]; |
| } |
| |
| public byte[] getreg() |
| { |
| byte [] ir=new byte[16]; |
| for (int i=0;i<16;i++) ir[i]=f[i]; |
| return ir; |
| } |
| |
| /* Initialise cipher */ |
| public void init(int m,byte[] key,byte[] iv) |
| { /* Key=16 bytes */ |
| /* Key Scheduler. Create expanded encryption key */ |
| int i,j,k,N,nk; |
| int [] CipherKey=new int[4]; |
| byte [] b=new byte[4]; |
| nk=4; |
| reset(m,iv); |
| N=44; |
| |
| for (i=j=0;i<nk;i++,j+=4) |
| { |
| for (k=0;k<4;k++) b[k]=key[j+k]; |
| CipherKey[i]=pack(b); |
| } |
| for (i=0;i<nk;i++) fkey[i]=CipherKey[i]; |
| for (j=nk,k=0;j<N;j+=nk,k++) |
| { |
| fkey[j]=fkey[j-nk]^SubByte(ROTL24(fkey[j-1]))^((int)rco[k])&0xff; |
| for (i=1;i<nk && (i+j)<N;i++) |
| fkey[i+j]=fkey[i+j-nk]^fkey[i+j-1]; |
| } |
| |
| /* now for the expanded decrypt key in reverse order */ |
| |
| for (j=0;j<4;j++) rkey[j+N-4]=fkey[j]; |
| for (i=4;i<N-4;i+=4) |
| { |
| k=N-4-i; |
| for (j=0;j<4;j++) rkey[k+j]=InvMixCol(fkey[i+j]); |
| } |
| for (j=N-4;j<N;j++) rkey[j-N+4]=fkey[j]; |
| } |
| |
| /* Encrypt a single block */ |
| public void ecb_encrypt(byte[] buff) |
| { |
| int i,j,k; |
| int t; |
| byte [] b=new byte[4]; |
| int [] p=new int[4]; |
| int [] q=new int[4]; |
| |
| for (i=j=0;i<4;i++,j+=4) |
| { |
| for (k=0;k<4;k++) b[k]=buff[j+k]; |
| p[i]=pack(b); |
| p[i]^=fkey[i]; |
| } |
| |
| k=4; |
| |
| /* State alternates between p and q */ |
| for (i=1;i<10;i++) |
| { |
| q[0]=fkey[k]^ftable[p[0]&0xff]^ |
| ROTL8(ftable[(p[1]>>>8)&0xff])^ |
| ROTL16(ftable[(p[2]>>>16)&0xff])^ |
| ROTL24(ftable[(p[3]>>>24)&0xff]); |
| q[1]=fkey[k+1]^ftable[p[1]&0xff]^ |
| ROTL8(ftable[(p[2]>>>8)&0xff])^ |
| ROTL16(ftable[(p[3]>>>16)&0xff])^ |
| ROTL24(ftable[(p[0]>>>24)&0xff]); |
| q[2]=fkey[k+2]^ftable[p[2]&0xff]^ |
| ROTL8(ftable[(p[3]>>>8)&0xff])^ |
| ROTL16(ftable[(p[0]>>>16)&0xff])^ |
| ROTL24(ftable[(p[1]>>>24)&0xff]); |
| q[3]=fkey[k+3]^ftable[p[3]&0xff]^ |
| ROTL8(ftable[(p[0]>>>8)&0xff])^ |
| ROTL16(ftable[(p[1]>>>16)&0xff])^ |
| ROTL24(ftable[(p[2]>>>24)&0xff]); |
| |
| k+=4; |
| for (j=0;j<4;j++) |
| { |
| t=p[j]; p[j]=q[j]; q[j]=t; |
| } |
| } |
| |
| /* Last Round */ |
| |
| q[0]=fkey[k]^((int)fbsub[p[0]&0xff]&0xff)^ |
| ROTL8((int)fbsub[(p[1]>>>8)&0xff]&0xff)^ |
| ROTL16((int)fbsub[(p[2]>>>16)&0xff]&0xff)^ |
| ROTL24((int)fbsub[(p[3]>>>24)&0xff]&0xff); |
| |
| q[1]=fkey[k+1]^((int)fbsub[p[1]&0xff]&0xff)^ |
| ROTL8((int)fbsub[(p[2]>>>8)&0xff]&0xff)^ |
| ROTL16((int)fbsub[(p[3]>>>16)&0xff]&0xff)^ |
| ROTL24((int)fbsub[(p[0]>>>24)&0xff]&0xff); |
| |
| q[2]=fkey[k+2]^((int)fbsub[p[2]&0xff]&0xff)^ |
| ROTL8((int)fbsub[(p[3]>>>8)&0xff]&0xff)^ |
| ROTL16((int)fbsub[(p[0]>>>16)&0xff]&0xff)^ |
| ROTL24((int)fbsub[(p[1]>>>24)&0xff]&0xff); |
| |
| q[3]=fkey[k+3]^((int)fbsub[(p[3])&0xff]&0xff)^ |
| ROTL8((int)fbsub[(p[0]>>>8)&0xff]&0xff)^ |
| ROTL16((int)fbsub[(p[1]>>>16)&0xff]&0xff)^ |
| ROTL24((int)fbsub[(p[2]>>>24)&0xff]&0xff); |
| |
| for (i=j=0;i<4;i++,j+=4) |
| { |
| b=unpack(q[i]); |
| for (k=0;k<4;k++) buff[j+k]=b[k]; |
| } |
| } |
| |
| /* Decrypt a single block */ |
| public void ecb_decrypt(byte[] buff) |
| { |
| int i,j,k; |
| int t; |
| byte [] b=new byte[4]; |
| int [] p=new int[4]; |
| int [] q=new int[4]; |
| |
| for (i=j=0;i<4;i++,j+=4) |
| { |
| for (k=0;k<4;k++) b[k]=buff[j+k]; |
| p[i]=pack(b); |
| p[i]^=rkey[i]; |
| } |
| |
| k=4; |
| |
| /* State alternates between p and q */ |
| for (i=1;i<10;i++) |
| { |
| q[0]=rkey[k]^rtable[p[0]&0xff]^ |
| ROTL8(rtable[(p[3]>>>8)&0xff])^ |
| ROTL16(rtable[(p[2]>>>16)&0xff])^ |
| ROTL24(rtable[(p[1]>>>24)&0xff]); |
| q[1]=rkey[k+1]^rtable[p[1]&0xff]^ |
| ROTL8(rtable[(p[0]>>>8)&0xff])^ |
| ROTL16(rtable[(p[3]>>>16)&0xff])^ |
| ROTL24(rtable[(p[2]>>>24)&0xff]); |
| q[2]=rkey[k+2]^rtable[p[2]&0xff]^ |
| ROTL8(rtable[(p[1]>>>8)&0xff])^ |
| ROTL16(rtable[(p[0]>>>16)&0xff])^ |
| ROTL24(rtable[(p[3]>>>24)&0xff]); |
| q[3]=rkey[k+3]^rtable[p[3]&0xff]^ |
| ROTL8(rtable[(p[2]>>>8)&0xff])^ |
| ROTL16(rtable[(p[1]>>>16)&0xff])^ |
| ROTL24(rtable[(p[0]>>>24)&0xff]); |
| |
| k+=4; |
| for (j=0;j<4;j++) |
| { |
| t=p[j]; p[j]=q[j]; q[j]=t; |
| } |
| } |
| |
| /* Last Round */ |
| |
| q[0]=rkey[k]^((int)rbsub[p[0]&0xff]&0xff)^ |
| ROTL8((int)rbsub[(p[3]>>>8)&0xff]&0xff)^ |
| ROTL16((int)rbsub[(p[2]>>>16)&0xff]&0xff)^ |
| ROTL24((int)rbsub[(p[1]>>>24)&0xff]&0xff); |
| q[1]=rkey[k+1]^((int)rbsub[p[1]&0xff]&0xff)^ |
| ROTL8((int)rbsub[(p[0]>>>8)&0xff]&0xff)^ |
| ROTL16((int)rbsub[(p[3]>>>16)&0xff]&0xff)^ |
| ROTL24((int)rbsub[(p[2]>>>24)&0xff]&0xff); |
| q[2]=rkey[k+2]^((int)rbsub[p[2]&0xff]&0xff)^ |
| ROTL8((int)rbsub[(p[1]>>>8)&0xff]&0xff)^ |
| ROTL16((int)rbsub[(p[0]>>>16)&0xff]&0xff)^ |
| ROTL24((int)rbsub[(p[3]>>>24)&0xff]&0xff); |
| q[3]=rkey[k+3]^((int)rbsub[p[3]&0xff]&0xff)^ |
| ROTL8((int)rbsub[(p[2]>>>8)&0xff]&0xff)^ |
| ROTL16((int)rbsub[(p[1]>>>16)&0xff]&0xff)^ |
| ROTL24((int)rbsub[(p[0]>>>24)&0xff]&0xff); |
| |
| for (i=j=0;i<4;i++,j+=4) |
| { |
| b=unpack(q[i]); |
| for (k=0;k<4;k++) buff[j+k]=b[k]; |
| } |
| |
| } |
| |
| /* Encrypt using selected mode of operation */ |
| public int encrypt(byte[] buff) |
| { |
| int j,bytes; |
| byte[] st=new byte[16]; |
| int fell_off; |
| |
| // Supported Modes of Operation |
| |
| fell_off=0; |
| switch (mode) |
| { |
| case ECB: |
| ecb_encrypt(buff); |
| return 0; |
| case CBC: |
| for (j=0;j<16;j++) buff[j]^=f[j]; |
| ecb_encrypt(buff); |
| for (j=0;j<16;j++) f[j]=buff[j]; |
| return 0; |
| |
| case CFB1: |
| case CFB2: |
| case CFB4: |
| bytes=mode-CFB1+1; |
| for (j=0;j<bytes;j++) fell_off=(fell_off<<8)|f[j]; |
| for (j=0;j<16;j++) st[j]=f[j]; |
| for (j=bytes;j<16;j++) f[j-bytes]=f[j]; |
| ecb_encrypt(st); |
| for (j=0;j<bytes;j++) |
| { |
| buff[j]^=st[j]; |
| f[16-bytes+j]=buff[j]; |
| } |
| return fell_off; |
| |
| case OFB1: |
| case OFB2: |
| case OFB4: |
| case OFB8: |
| case OFB16: |
| |
| bytes=mode-OFB1+1; |
| ecb_encrypt(f); |
| for (j=0;j<bytes;j++) buff[j]^=f[j]; |
| return 0; |
| |
| default: |
| return 0; |
| } |
| } |
| |
| /* Decrypt using selected mode of operation */ |
| public int decrypt(byte[] buff) |
| { |
| int j,bytes; |
| byte[] st=new byte[16]; |
| int fell_off; |
| |
| // Supported modes of operation |
| fell_off=0; |
| switch (mode) |
| { |
| case ECB: |
| ecb_decrypt(buff); |
| return 0; |
| case CBC: |
| for (j=0;j<16;j++) |
| { |
| st[j]=f[j]; |
| f[j]=buff[j]; |
| } |
| ecb_decrypt(buff); |
| for (j=0;j<16;j++) |
| { |
| buff[j]^=st[j]; |
| st[j]=0; |
| } |
| return 0; |
| case CFB1: |
| case CFB2: |
| case CFB4: |
| bytes=mode-CFB1+1; |
| for (j=0;j<bytes;j++) fell_off=(fell_off<<8)|f[j]; |
| for (j=0;j<16;j++) st[j]=f[j]; |
| for (j=bytes;j<16;j++) f[j-bytes]=f[j]; |
| ecb_encrypt(st); |
| for (j=0;j<bytes;j++) |
| { |
| f[16-bytes+j]=buff[j]; |
| buff[j]^=st[j]; |
| } |
| return fell_off; |
| case OFB1: |
| case OFB2: |
| case OFB4: |
| case OFB8: |
| case OFB16: |
| bytes=mode-OFB1+1; |
| ecb_encrypt(f); |
| for (j=0;j<bytes;j++) buff[j]^=f[j]; |
| return 0; |
| |
| |
| default: |
| return 0; |
| } |
| } |
| |
| /* Clean up and delete left-overs */ |
| public void end() |
| { // clean up |
| int i; |
| for (i=0;i<44;i++) |
| fkey[i]=rkey[i]=0; |
| for (i=0;i<16;i++) |
| f[i]=0; |
| } |
| /* |
| public static void main(String[] args) { |
| int i; |
| |
| byte[] key=new byte[16]; |
| byte[] block=new byte[16]; |
| byte[] iv=new byte[16]; |
| |
| for (i=0;i<16;i++) key[i]=0; |
| key[0]=1; |
| for (i=0;i<16;i++) iv[i]=(byte)i; |
| for (i=0;i<16;i++) block[i]=(byte)i; |
| |
| AES a=new AES(); |
| |
| a.init(CBC,key,iv); |
| System.out.println("Plain= "); |
| for (i=0;i<16;i++) System.out.format("%02X ", block[i]&0xff); |
| System.out.println(""); |
| |
| a.encrypt(block); |
| |
| System.out.println("Encrypt= "); |
| for (i=0;i<16;i++) System.out.format("%02X ", block[i]&0xff); |
| System.out.println(""); |
| |
| a.reset(CBC,iv); |
| a.decrypt(block); |
| |
| System.out.println("Decrypt= "); |
| for (i=0;i<16;i++) System.out.format("%02X ", block[i]&0xff); |
| System.out.println(""); |
| |
| a.end(); |
| |
| } */ |
| } |