Длина ввода должна быть кратна 16 при дешифровании с добавленным шифром в GSTR7 - PullRequest
0 голосов
/ 23 октября 2019

Как я могу устранить эту ошибку при запуске следующего кода?

String decrypted_appkey = "41+sD/gm9DWQeZbJm98qb3ss9Eu96XkClU5a4hyfaAw=";
String receivedSEK = "0x5D112907B134B9CE30E30745F48A536845521B04F6B912552AAA65B563F01CC0";
decryptedSek = NICEncrypt.decrypt(receivedSEK, decodeBase64StringTOByte(decrypted_appkey));

public static String decrypt(String plainText, byte[] secret)
     throws InvalidKeyException, IOException, IllegalBlockSizeException,
     BadPaddingException, Exception {
     SecretKeySpec sk = new SecretKeySpec(secret, AES_ALGORITHM);
     DECRYPT_CIPHER.init(Cipher.DECRYPT_MODE, sk);
     byte[] bytes = DECRYPT_CIPHER.doFinal(Base64.getDecoder().decode(plainText));
     return Base64.getEncoder().encodeToString(bytes);
}
private static byte[] decodeBase64StringTOByte(String stringData) throws Exception {
     return java.util.Base64.getDecoder().decode(stringData.getBytes(CHARACTER_ENCODING));
}

Вывод:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher  at
com.sun.crypto.provider.CipherCore.prepareInputBuffer(CipherCore.java:1005) at 
com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:848) at 
com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446) at 
javax.crypto.Cipher.doFinal(Cipher.java:2164)

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Обычно так называемые «обернутые» ключи вообще не дополняются. То, что вы получили, вполне может быть зашифрованным 256-битным ключом (AES). Обычно для этого вы используете "AES/ECB/NoPadding", но без спецификации протокола это просто обоснованное предположение. Обратите внимание, что - для стандартного поставщика - строка "AES" по умолчанию имеет значение "AES/ECB/PKCS5Padding" и попытается распаковать ее.

Кроме того, ваш обернутый ключ явно не в базе 64, а в шестнадцатеричном формате. Сначала необходимо декодировать шестнадцатеричные числа и исключить "0x" перед завернутым ключом.

0 голосов
/ 23 октября 2019

receivedSEK не в Base64, но, по-видимому, какая-то "шестнадцатеричная" строка.

String receivedSEK = "0x5D112907B134B9CE30E30745F48A536845521B04F6B912552AAA65B563F01CC0";
int n = (receivedSEK.length() - 2) / 2;
byte[] bytes = new byte[n];
for (int i = 0; i < n; ++i) {
    bytes[i] = (byte) Integer.parseInt(receivedSEK.substring(2 + 2*i, 4 + 2*i), 16);
}
decryptedSek = NICEncrypt.decrypt(bytes, decodeBase64StringTOByte(decrypted_appkey));

public static String decrypt(byte[] bytes, byte[] secret)
     throws InvalidKeyException, IOException, IllegalBlockSizeException,
     BadPaddingException, Exception {
     SecretKeySpec sk = new SecretKeySpec(secret, AES_ALGORITHM);
     DECRYPT_CIPHER.init(Cipher.DECRYPT_MODE, sk);
     byte[] bytes = DECRYPT_CIPHER.doFinal(bytes);
     return Base64.getEncoder().encodeToString(bytes);
}

private static byte[] decodeBase64StringTOByte(String stringData) throws Exception {
     return Base64.getDecoder().decode(stringData);
}

Также расшифровка Base64 проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...