【问题标题】:I have encrypted AES Key with AES Key,Stored the Key as String in DataBase, when i try to decrypt the Key i get :我已经用 AES 密钥加密了 AES 密钥,将密钥作为字符串存储在数据库中,当我尝试解密得到的密钥时:
【发布时间】:2015-01-13 20:24:36
【问题描述】:
javax.crypto.IllegalBlockSizeException: 
    Input length must be multiple of 16 when decrypting with padded cipher

请检查代码的重要部分:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecretKey secKey = (SecretKey) keyGen.generateKey();
SecretKey secKey1 = (SecretKey) keyGen1.generateKey();

byte[] stringKey=secKey.getEncoded();

cipher.init(Cipher.ENCRYPT_MODE, secKey1);
byte[] DykeyBytes = cipher.doFinal(stringKey);

StringBuffer sbselect2=new StringBuffer();
sbselect2.append("SELECT keylock FROM ");
sbselect2.append(UserConstants.USER_DETAILS_TABLE_NAME1);
sbselect2.append(" where Username='" + un + "'");
ps2=conn.prepareStatement(sbselect2.toString());
ResultSet rs1 =ps2.executeQuery();
rs1.next();
String Enkey = rs1.getString("keylock");

System.out.println("Encrypted+Encoded key from current user "+Enkey);
rs1.close();

//decrypting the DB stored Key
Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher2.init(Cipher.DECRYPT_MODE, singlekey );
byte[] dynamicKey = Enkey.getBytes("UTF8");
// below is where the error points  to at user.dao.UserDao.isRegisteredUser(UserDao.java:313)
byte[] decryptedBytes = cipher2.doFinal(dynamicKey);

Object DeKey = new String(decryptedBytes);//under check
SecretKeySpec key = new SecretKeySpec(decryptedBytes, "AES");

【问题讨论】:

  • 让我补充一点:我发现字符串的输入长度是 48,当从数据库中检索回来时它是 58
  • 请不要还原提高问题的可读性和格式的编辑。
  • 很抱歉这不是故意的。
  • 有没有办法解决这个问题

标签: java database encryption cryptography


【解决方案1】:

嘿,伙计们,我很高兴今天我尝试了几种类型的逻辑,最后我找到了答案,我相信我是第一个得到它的人。髋关节万岁。从上午 10 点到下午 6 点,我的努力得到了回报。

流程如下

Secret Key 生成---Base64Enocder---用相似的secretkey加密---Base64Encoded---转换成String---存入数据库---检索String---Base64Decoder---解密---Base64Decoder---SecretKeySpec- -walla 她是关键

输出: 加密前密钥: javax.crypto.spec.SecretKeySpec@178e7 。 base64:UKcvVLp9L51xxHHyLIRrgQ==。 base64double: wu8CBPMELHgp6WAGGFgHGWjPXn4MRibeZ9IKGRTpjJE= 。 加密 base64 后: wu8CBPMELHgp6WAGGFgHGWjPXn4MRibeZ9IKGRTpjJE= 。 解密后 base64double : [B@1cfe433 . 解密后 base64 : [B@18f11d3 . 在 base64decoder 和 keyspec 之后:javax.crypto.spec.SecretKeySpec@178e7。

【讨论】:

  • 忘记说将 Key 列更改为 unicode 而不是 UTF8
  • 最终结果证明 iv[] 输出 ---- [B@a6d290 加密前密钥:javax.crypto.spec.SecretKeySpec@17b62 加密字节的加密密码+ ?????????来自 db 的加密字节长度 8 iv 字节数据的加密密码---[B@1a35b19 解码和解密密钥 ++javax.crypto.spec.SecretKeySpec@17b62 加密字节的加密密码+ ????????加密字节长度为 8 的加密密码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多