【Kotlin入門】Base64エンコードとデコード(getEncoder, getDecoder)
暗号化するほどのデータでもないけど、なんとなく生で流すのが嫌なデータってありますよね。
(通信経路の暗号化とは別の話です)
そんな時は簡易的に情報を Bse64 でエンコードして、送信先でデコードしてもらう手段も検討されます。
逆に相手からエンコードされた情報をもらい、こちら側でデコードする場面も想定しておくといいかもしれません。
無駄に鍵を共有して AES で暗号化するとか、そこまでする必要のないデータもありますからね。
今回は、Kotlin で Base64 のエンコードとデコードを試してみたいと思います。
Base64エンコード
Kotlin で Base64 を使用する場合は、以下の Java のパッケージを利用します。
エンコードする場合は、バイト文字列を Base64 文字列に変換してあげます。
val s: String = "abcdefg"
val b64Encode: String = Base64.getEncoder().encodeToString(s.toByteArray())
println(b64Encode)
結果は以下の通りです。
YWJjZGVmZw==
試しに Linux の base64 コマンドでデコードして確認してみます。
$ echo "YWJjZGVmZw==" | base64 -d
abcdefg
元の文字列に戻りましたね。ちなみに、Mac のターミナルだと base64 のデコードは -D オプションになります。
Base64デコード
次に、Kotlin で Base64 デコードを試してみます。
こちらも、Base64 のパッケージを利用するだけなので簡単です。
val s: String = "abcdefg"
val b64Encode: String = Base64.getEncoder().encodeToString(s.toByteArray())
val b64Decode = Base64.getDecoder().decode(b64Encode.toByteArray()).toString(Charsets.UTF_8)
println(b64Decode)
結果は以下の通りです。
abcdefg
エンコードやデコードの失敗
エンコードはともかく、第三者から送られてくるデータをデコードする場合は要注意です。
Base64 でエンコードした文字列から複合化できない場合に例外が発生するからです。
上記でエンコードした「YWJjZGVmZw==」は、最後の Zw が 4 文字に満たないため == で 2 文字分吸収しているところがあります。ここをなぜか === の 3 文字にされて送信されてきたと仮定します。
YWJjZGVmZw===
この文字列を Base64 でデコードしてみます。
val b64Encode: String = "YWJjZGVmZw==="
val b64Decode = Base64.getDecoder().decode(b64Encode.toByteArray()).toString(Charsets.UTF_8)
println(b64Decode)
想定通り例外が発生しました。
Exception in thread “main” java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 12
at java.util.Base64$Decoder.decode0(Base64.java:742)
at java.util.Base64$Decoder.decode(Base64.java:526)
よって、事前に IllegalArgumentException をハンドリングできるようにしておきましょう。
(現在は runCatching が主流ですが、ここでは try, catch で)
try {
val b64Encode: String = "YWJjZGVmZw==="
val b64Decode = Base64.getDecoder().decode(b64Encode.toByteArray()).toString(Charsets.UTF_8)
println(b64Decode)
} catch(e: IllegalArgumentException) {
println("デコードできない文字列が送られてきました")
}
結果はもちろん以下になります。
デコードできない文字列が送られてきました