【Java】Given final block not properly padded
別サイトで連携するアプリケーションで暗号化・複合化を行うシステムを作っていました。
例としてお客さんから暗号化対象の文字列と暗号化後の文字列が送られてきました。
しかし、同じ文字列・方式・キーを使用しているのにも関わらず、こちらで暗号化した文字列と送られてきた文字列が一致しませんでした。
送られてきた文字列をJavaで複合化してみると、エラーが発生しました。
Given final block not properly padded
貰った最後のブロックが正しく埋められなかったとのことです。
メッセージの内容からすると、パディング方式の問題でしょうか。
複合化に使用したコードです。
String algorithm = "Blowfish"; String mode = "Blowfish/ECB/PKCS5Padding"; String target = "暗号化された文字列"; String key = "key"; byte[] encrypted; byte[] decrypted; String str; SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm); Cipher cipher = Cipher.getInstance(mode); // 暗号化モード cipher.init(Cipher.DECRYPT_MODE, sksSpec); // Base64デコードをする encrypted = Base64.getDecoder().decode(target); // 結果 decrypted = cipher.doFinal(encrypted); str = new String(decrypted, "UTF-8"); System.out.println(str);
確認用のコードなので他所様のものをパクってます。
エラーが出てしょうがないので、パディング方式を無しにして試しました。
String algorithm = "Blowfish"; String mode = "Blowfish/ECB/NoPadding"; String target = "暗号化された文字列"; String key = "key"; byte[] encrypted; byte[] decrypted; String str; SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm); Cipher cipher = Cipher.getInstance(mode); // 暗号化モード cipher.init(Cipher.DECRYPT_MODE, sksSpec); // Base64デコードをする encrypted = Base64.getDecoder().decode(target); // 結果 decrypted = cipher.doFinal(encrypted); str = new String(decrypted, "UTF-8"); System.out.println(str);
結果として帰ってきた文字列は最後のパディング部分が文字列になったものを除くと暗号化前の文字列でした。
暗号化モードはECB方式なのでパディング部分をコピペして内容を確認しました。
String paddingString = ""; byte[] byteArray; byte b; // バイト配列を取得する byteArray = paddingString.getBytes(); // バイトを取得する b = byteArray[0]; // パディングに使われた数値を取得する System.out.println(b & 0xFF);
パディングに使われた数値は「0x05」でした。
「0x05」が返ってくるということはパディングに5バイト分追加されているはずなのですが、1バイト分しか追加されていませんでした。
暗号化対象の文字列は71バイトだったため、8バイトごとのブロックにする際は1バイトのみ追加となるのでここは正しいです。
しかし、追加するバイトの内容が違ったようです。
1バイトのみ追加する場合は「0x01」になるはずですね。
つまり、送られてきた暗号化後文字列が間違っていることとなり、パディング方式のロジックがおかしいということになります。
聞いてみるとパディング部分のロジックは自分達で作成したとのことなので、それが原因だったようです。
時間はかかりましたが、原因が分かって良かったです。
個人的には怒られ損となってしまいましたが。。
簡単な動作確認用ページを作成しました。
不具合があったらごめんなさい。
No comments.