【问题标题】:Removing characters from decrypted Base64 string in Java从Java中解密的Base64字符串中删除字符
【发布时间】:2015-04-04 22:08:27
【问题描述】:

关于这个问题; Java (Android) Decrypting msg with IV attached

我的消息可以正常解密,但包含不需要的 IV 字节数据。
我尝试删除附加的 IV,但它并没有删除所有字符,并且某些字符总是留在后面。我不确定我应该如何计算编码 IV 的长度以删除不需要的字符。

public String decrypt(String cipherText, byte[] encryptionKey) throws Exception {
    SecretKeySpec key = new SecretKeySpec(encryptionKey, "AES");          
    cipher.init(Cipher.DECRYPT_MODE, key, iV);
    String decrypt = new String(cipher.doFinal( Base64.decode(cipherText, Base64.DEFAULT)));

    byte[] decryptData = new byte[decrypt.getBytes().length - iV.getIV().length];
    System.arraycopy(decrypt.getBytes(), iV.getIV().length, decryptData, 0, decrypt.getBytes().length - iV.getIV().length);

    Log.d("decrypt = ", decrypt);

    decrypt = new String(decryptData, "UTF-8");

    return decrypt;
}   

【问题讨论】:

    标签: java android encryption base64 initialization-vector


    【解决方案1】:

    您需要在解密之前而不是之后删除IV,因为它是解密的参数。由于 IV 已预先添加到密文中,因此无需将其保存在其他位置(无需您的 iV 参考)。

    byte[] ciphertextBytes = Base64.decode(cipherText, Base64.DEFAULT);
    IvParameterSpec iv = new IvParameterSpec(ciphertextBytes, 0, 16);
    ciphertextBytes = Arrays.copyOfRange(ciphertextBytes, 16, ciphertextBytes.length);
    
    SecretKeySpec key = new SecretKeySpec(encryptionKey, "AES");          
    cipher.init(Cipher.DECRYPT_MODE, key, iv);
    String decrypt = new String(cipher.doFinal(ciphertextBytes), "UTF-8");
    

    【讨论】:

    • 日志输出 - “javax.crypto.IllegalBlockSizeException: 最后一个块在解密中不完整”
    • 你能检查一下ciphertextBytes在解密之前有多长时间吗?这可能是Arrays.copyOfRange() 的索引问题
    • 去掉-ivLen (16),使解密工作完美。发送“嘿”消息,ciphertextBytes长度为16
    • 我已经将 IvParameterSpec 构造函数拆分为两个调用,这是我以前的方法,但我认为我可以减少一行。
    • 不,没有变化。出现相同的错误/警告。再次删除 - 16 但使其工作。
    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多