5

私は以下の方法を持っています:

public String decrypt(String strToBeDecrypted) {
    try {
        strToBeDecrypted = URLDecoder.decode(strToBeDecrypted, "UTF-8");
        DESKeySpec desKeySpec = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey skey = keyFactory.generateSecret(desKeySpec);

        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        cipher.init(Cipher.DECRYPT_MODE, skey, ivSpec);

        byte[] keyByteArray = new BASE64Decoder().decodeBuffer(strToBeDecrypted);

        byte[] original = cipher.doFinal(keyByteArray);

        return new String(original, "UTF-8");
    } catch (Exception e) {
        logger.error(ExceptionUtil.getDetailedMessage(e));
    }
    return "";
}

これは投げてる

"name=javax.crypto.IllegalBlockSizeException;message=Input length must be multiple of 8 when decrypting with padded cipher;"

以下の行で:

 byte[] original = cipher.doFinal(keyByteArray);

誰かがここで何が問題なのか教えてもらえますか?

4

2 に答える 2

4

参照している入力の長さは、ブロック サイズの倍数であると予想される暗号文 (strToBeDecrypted) の長さです。デフォルトでは、ライブラリは入力がパディングされることを期待していることを意味します。

つまり、復号化するときにパディングを「なし」に設定する必要があるか (暗号化時に使用される「パディング」であったため)、何らかの方法で暗号文を破損したことを意味します。

「DES」を「DES/ECB/NoPadding」に変更してみてください。実装のデフォルトの暗号モードが何であるかはわかりませんが、通常は「ECB」または「CBC」です。これらの 2 つのいずれも機能しない場合は、暗号文がどこかで破損しています。

于 2013-10-04T19:06:46.620 に答える