Я получил сообщение от AT5 (Atrack) unite, закодированное с помощью шифрования AES-128 ECB, и это ключ в шестнадцатеричном формате (33333838000000000000000000000000)
исходный ключ находится в строке "3388"
и это шифр, который я получил, но я преобразовал его в шестнадцатеричный
Всякий раз, когда я пытаюсь расшифровать сообщение, я сталкиваюсь с этим исключением:
Error while decrypting: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
Вот мой код:
orginalString
?U??????}MgD?R???`????
#?j????g:N???@???$=???r?u?>~??Qh,?N?????3?8:?-E??;?b<J??I?v{?'o?m[?|?CY?n????K????>?ã??<?,???? ??f?'???}&?}?7r%??93??!u?0D?3Ig|??%'????*??`?Y^?M?4J?I?>?tIu???;?RR;2??{nrl??us
?R?F?oi????
String strToDecrypt = "E255898281B7C0B67D4D6744DB52FA1789F760B99B86A40A1F238B6ABCC690C1C9673A4E07EA03F79B40B2ACC8243DD098F4B10E72BA75CE3E7EE50F935168042CC74EA2F4BBE3D833F4383AE02D45C0119C3BC8623C4AD5189249FAB0BB767BA2276FB56D5BF27CE017435901DD8F6EC9DECD05B74BF51A99B1933E89C3A3AD06CA893CE72CDDEAE5F509E2D01B66A02717AADD0C917D26BA7DB1377225CCF23933E5F92175BD3044C63349677CEBC6251B27BE1FC9FD7FC32A0785F36019C2595E1EE783B64DB2344A14CE49C63EAB74174975FCE1C53BD95252113B0332CBD7A37B6E726CCFF675730DB052B14605E36F69AF11E8F3D2002D8BABEFFF508187E4C176329A3ABE08CF2B9A9F4812CF4084BACE87AD116F49C2ACD449767E758CE9184C60268AE3AAEADA052C91BF16241682E333671AC209D5BDC34CFD2B2D0C8D6D795D36A5FBD707FB56F71B3740BA86B1CEAC6E784E8E2B999CC6C9260A13F697A115C80F29C5AA38E95964731073CB051BB8A201EBAE6443A057AA69CFF41C9A593F88E2D6A712107EABCDE7042134F818268BF31896072C1B399B878BACCECC096F79A8D1835C2766EA639341E4AB22820D5AAD0F202BC896BD6C6F4D1FB1873C5BE06278D11E67F577D0120E054971088E7DB7E3A8139B20C6E22B86205BC0F4778A1DA0D6E50416FCE55DBC576A9F907FC706148204CA3C79993A4F37756427871C12EB379B4BFA0A518FFCA2BC698B1CA68AC9B3548B241C12669CEFAC9C8ECDB7B5A8149B";
secretKey = new SecretKeySpec("33333838000000000000000000000000".getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] cipherResult = cipher.doFinal(Base64.decodeBase64(strToDecrypt));
он генерируется с аппаратного устройства, мы контролируем только ключ "3388"




Ваш strToDecrypt выглядит как закодированный в шестнадцатеричном формате, а не в кодировке base64 ... поэтому вам нужно декодировать его в шестнадцатеричном формате перед дешифровкой вместо декодирования base64. Но на самом деле вы зашифровали данные, если они были декодированы в шестнадцатеричном формате, также в конечном итоге будет иметь недопустимый размер. Ваша шестнадцатеричная строка составляет 1200 шестнадцатеричных символов = 600 байтов = 37,5 блоков AES по 16 байтов .. Кажется, что-то не так с вашими данными ..
Кроме того, ваш ключ также закодирован в шестнадцатеричном формате, поэтому вам нужно его декодировать в шестнадцатеричном формате ... а не просто делать getBytes(..).
просто потому, что строка содержит символы, разрешенные в базе 16 (шестнадцатеричные), не означает, что она должна быть шестнадцатеричной (вы сами доказали, что это не имеет никакого смысла, если она должна была тоже), также имеющая длину ключа 32 байта нет ничего плохого в этом (ни один из них не содержит шестнадцатеричных символов в ключевых байтах), поэтому мы можем просто вызвать getbytes.
@kamyarhaqqani: 1) Поскольку он предположительно зашифрован и имеет длину в сотню байтов, да, он фактически доказывает свою шестнадцатеричную кодировку; 2) Поскольку он говорит, что использует AES128, то да, ключ также закодирован в шестнадцатеричном коде, но 3) большая часть шифра в шестнадцатеричном коде слишком неслучайна, чтобы быть зашифрованной в любом случае.
@kamyarhaqqani Я написал, что ВИДЕТСЯ наговоркой .. Я выбрал эту формулировку специально, чтобы противостоять подобным педантичным дискуссиям. Что касается ключа, OP явно заявляет в вопросе, что он шестнадцатеричный, и длина этого шестнадцатеричного ключа точно соответствует длине 128-битного ключа, необходимой для AES-128, что также указано в вопросе.
Вы правы насчет ключа и педантичности этой дискуссии. сказав «вам нужно декодировать его в шестнадцатеричном формате перед дешифровкой», вы фактически заключаете, что любая строка, содержащая разрешенные символы base 16 (и «кажется» шестнадцатеричной) всегда является строкой в шестнадцатеричной кодировке, но это не так!
для ключа они используют строку «3388», и я конвертирую ее в шестнадцатеричный, чтобы получить его 16 байтов.
и шифр получил зашифрованное сообщение, начатое после второго "2C", однако я также пытаюсь расшифровать его, получаю то же исключение
поделитесь кодом того, как генерируется strToDecrypt. Base64.decodeBase64 (strToDecrypt) приведет к получению массива байтов размером 900. У 900 остается 4 байта при делении на 16.