【发布时间】:2015-03-20 15:41:28
【问题描述】:
我的加密方式是:
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)
这个错误说明什么?非常感谢任何帮助。
【问题讨论】:
-
@ArtjomB。添加加密方式。
-
您的代码看起来不错。你确定解密方法中的
ccNumber是加密方法的实际输出吗? -
@ArtjomB。是的,输出值是相同的:(
-
我刚刚尝试了您的代码,它应该可以工作。 this 完整代码对您有用吗?如果是这样,那么问题就在加密和解密之间。
-
@ArtjomB。感谢您的宝贵时间。我正在尝试您的代码。我正在使用“org.apache.commons.codec.binary.Base64”,而您使用的是 util.Base64。这可能是问题所在。 (因为我们的项目使用该库)Java 版本也是 7。
标签: java jakarta-ee encryption cryptography