当前位置: 首页 > 知识库问答 >
问题:

在GSTR7中使用填充密码解密时,输入长度必须是16的倍数

郑鸿朗
2023-03-14

运行以下代码时,如何解决此错误?

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)

共有1个答案

蒋浩
2023-03-14

通常,所谓的包装键根本没有填充。您收到的很可能是一个加密的256位(AES)密钥。通常您会使用“AES/ECB/Nopadding”,但如果没有协议规范,这只是一种知情的猜测。注意,对于标准提供程序,“aes”字符串默认为“aes/ecb/pkcs5padding”,并将尝试取消pad。

此外,包装的键显然不是以64为基数的,而是以十六进制为基数的。首先需要解码十六进制,并排除包装键前面的“0x”

 类似资料: