0

私のプロジェクトでは、Android クライアントとサーバーの間で安全な通信が使用されるため、それらの間のすべてのメッセージは DES アルゴリズムとして暗号化されます。デフォルトの Java プロバイダーと SpongyCastle を使用しましたが、最初の復号化の試行で以下の例外が発生します。

javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
at org.spongycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:815)
at javax.crypto.Cipher.doFinal(Cipher.java:1111)

以下のエンコードされた文字列

SB1DbM9MbtFYY62OtDwkU4+CxlHi7wj9MQIPVMsoktVyPZDoi79V2Hx5pzjLgQvxXKJSLP7BpNYZg4hlbVGzkCE8x4LTmTbdQzwweMjlOGfTbZSNA+iL1sx0ctRYFIVLu7c0ZnsSnJ4Fq2tdL2XS3YQW3/MokoAlyFK6lhBf/4t+VpZ/cy+s9g==

2 回目の試行で、String の復号化に成功しました。問題が見つかりませんでした。

暗号化および復号化するソース コード

private Cipher encryptCipher = null;
private Cipher decryptCipher = null;

static {
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}

public void initialize(SecretKey key) throws Exception {
    try {
        encryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding", "SC");
        decryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding", "SC");
    } catch (Exception e) {
    }

    encryptCipher.init(Cipher.ENCRYPT_MODE, key);
    decryptCipher.init(Cipher.DECRYPT_MODE, key);
}

public String encryptBase64(String unencryptedString) throws Exception {
    byte[] unencryptedByteArray = unencryptedString.getBytes("UTF-8");
    byte[] encryptedBytes = encryptCipher.doFinal(unencryptedByteArray);
    return new String(Base64.encodeBase64(encryptedBytes), "UTF-8");
}

public String decryptBase64(String encryptedString) throws Exception {
    try {
        byte[] unencryptedByteArray = decryptCipher.doFinal(Base64.decodeBase64(encryptedString.getBytes("UTF-8")));
        String message = new String(unencryptedByteArray, "UTF-8");
        return message;
    } catch (Exception e) {
    }

    return null;
}
4

0 に答える 0