Шифрование Java AES-128 ECB

Я получил сообщение от 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));

поделитесь кодом того, как генерируется strToDecrypt. Base64.decodeBase64 (strToDecrypt) приведет к получению массива байтов размером 900. У 900 остается 4 байта при делении на 16.

kamyar haqqani 15.11.2018 20:11

он генерируется с аппаратного устройства, мы контролируем только ключ "3388"

Mostafa Hafez 16.11.2018 11:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 922
1

Ответы 1

Ваш strToDecrypt выглядит как закодированный в шестнадцатеричном формате, а не в кодировке base64 ... поэтому вам нужно декодировать его в шестнадцатеричном формате перед дешифровкой вместо декодирования base64. Но на самом деле вы зашифровали данные, если они были декодированы в шестнадцатеричном формате, также в конечном итоге будет иметь недопустимый размер. Ваша шестнадцатеричная строка составляет 1200 шестнадцатеричных символов = 600 байтов = 37,5 блоков AES по 16 байтов .. Кажется, что-то не так с вашими данными ..

Кроме того, ваш ключ также закодирован в шестнадцатеричном формате, поэтому вам нужно его декодировать в шестнадцатеричном формате ... а не просто делать getBytes(..).

просто потому, что строка содержит символы, разрешенные в базе 16 (шестнадцатеричные), не означает, что она должна быть шестнадцатеричной (вы сами доказали, что это не имеет никакого смысла, если она должна была тоже), также имеющая длину ключа 32 байта нет ничего плохого в этом (ни один из них не содержит шестнадцатеричных символов в ключевых байтах), поэтому мы можем просто вызвать getbytes.

kamyar haqqani 15.11.2018 20:28

@kamyarhaqqani: 1) Поскольку он предположительно зашифрован и имеет длину в сотню байтов, да, он фактически доказывает свою шестнадцатеричную кодировку; 2) Поскольку он говорит, что использует AES128, то да, ключ также закодирован в шестнадцатеричном коде, но 3) большая часть шифра в шестнадцатеричном коде слишком неслучайна, чтобы быть зашифрованной в любом случае.

President James K. Polk 15.11.2018 21:34

@kamyarhaqqani Я написал, что ВИДЕТСЯ наговоркой .. Я выбрал эту формулировку специально, чтобы противостоять подобным педантичным дискуссиям. Что касается ключа, OP явно заявляет в вопросе, что он шестнадцатеричный, и длина этого шестнадцатеричного ключа точно соответствует длине 128-битного ключа, необходимой для AES-128, что также указано в вопросе.

Ebbe M. Pedersen 15.11.2018 23:42

Вы правы насчет ключа и педантичности этой дискуссии. сказав «вам нужно декодировать его в шестнадцатеричном формате перед дешифровкой», вы фактически заключаете, что любая строка, содержащая разрешенные символы base 16 (и «кажется» шестнадцатеричной) всегда является строкой в ​​шестнадцатеричной кодировке, но это не так!

kamyar haqqani 16.11.2018 01:30

для ключа они используют строку «3388», и я конвертирую ее в шестнадцатеричный, чтобы получить его 16 байтов.

Mostafa Hafez 16.11.2018 11:12

и шифр получил зашифрованное сообщение, начатое после второго "2C", однако я также пытаюсь расшифровать его, получаю то же исключение

Mostafa Hafez 16.11.2018 11:19

Другие вопросы по теме