Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解密信用卡号时返回javax.crypto.IllegalBlockSizeException_Java_Jakarta Ee_Encryption_Cryptography - Fatal编程技术网

解密信用卡号时返回javax.crypto.IllegalBlockSizeException

解密信用卡号时返回javax.crypto.IllegalBlockSizeException,java,jakarta-ee,encryption,cryptography,Java,Jakarta Ee,Encryption,Cryptography,我的加密方法是: private static final String ALGORITHM = "AES/ECB/PKCS5Padding"; private static final byte[] KEY = "StBet9834#$10BCy".getBytes(); private String encryptCreditCard(String ccNumber) { // do some encryption if (ccNumber == null || ccNum

我的加密方法是:

private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
private static final byte[] KEY = "StBet9834#$10BCy".getBytes();

private String encryptCreditCard(String ccNumber) {
    // do some encryption
    if (ccNumber == null || ccNumber.length() == 0) {
        return "";
    }
    Key key = new SecretKeySpec(KEY, "AES");
    try {
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.ENCRYPT_MODE, key);
        //return Base64.encodeBytes(c.doFinal(ccNumber.getBytes()));
        byte[] ccNumberBytes = ccNumber.getBytes();
        byte[] encCCNumber = c.doFinal(ccNumberBytes);
        return new String(Base64.encodeBase64(encCCNumber));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
我使用以下方法解密我的信用卡详细信息:

public void decryptCreditCard() {
  Key key = new SecretKeySpec(KEY, "AES");
  try {
    String ccNumber = this.cardNumber;
    if (ccNumber == null || ccNumber.length() == 0) {
      return;
    }
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] ccENCBytes = Base64.decodeBase64(ccNumber);
    byte[] ccDECBytes = c.doFinal(ccENCBytes);
    this.plainCardNumber = new String(ccDECBytes);
    this.last4CreditCard =             plainCardNumber.substring(this.plainCardNumber.length() - 4);
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}
我的测试卡号字符串是:5123456789012346。执行此行时:

byte[] ccDECBytes = c.doFinal(ccENCBytes);
我得到以下例外情况:

Caused by: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
  at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
  at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
  at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
  at javax.crypto.Cipher.doFinal(Cipher.java:2087)
  at stbet.model.core.CustomerAccount.decryptCreditCard(CustomerAccount.java:527)

这个错误表示什么?非常感谢您的帮助。

您的算法必须用填充表示密码:例如:AES/CBC/PKCS5Padding

编码消息的字符串表示不能丢失字节。您正在对字符串使用defualt编码,因此很可能是UTF-8,这不合适。您需要字节到字节的映射,例如:“ISO-8859-1”

返回新字符串(Base64.encodeBase64(encCCNumber),“ISO-8859-1”)


或者简单地使用Base64.encodeBase64String来完成这项工作

@ArtjomB。添加了加密方法。您的代码看起来很好。您确定解密方法中的
ccNumber
是加密方法的实际输出吗?@ArtjomB。是的,输出值是相同的:(我刚刚尝试了你的代码,它应该可以工作。完整的代码对你有效吗?如果有效,那么问题就在加密和解密之间。@ArtjomB。感谢你宝贵的时间。我正在尝试你的代码。我正在使用“org.apache.commons.codec.binary.Base64”当您使用util.Base64时,这可能是问题所在。(当我们的项目使用该库时)java版本也是7。字符串/字节转换必须保留“字节”。请参阅完整答案。我也尝试了您的解决方案。但错误仍然是一样的。虽然这些都是好主意,但它们不应导致出现
IllegalBlockSizeException