私のプロジェクトでは、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;
}