[Flutter][暗号化]画像・動画の読み込み書き込み時のファイル形式
画像・動画ファイルを暗号化する流れの中で、「List<int>」やら「Uint8List」やらファイル形式が色々出てきて訳がわからなくなったので、手順を自分なりにまとめます。
全体の流れ
- 暗号化前の元画像・動画データ読み込み
- データの暗号化
- 暗号化後のデータを書き込むためのファイル作成
- 3で作成したファイルに暗号化後のデータ書き込み
- 元データの削除
全体の流れは上記の通りです。
バイナリデータとは
本題に入る前にバイナリデータについて触れておきます。
バイナリデータとは、コンピュータが直接理解・処理できる、0と1の2進数で表現されたデータのことで、実行形式のプログラム、画像、音声、動画データはこの形式で表されます。
元画像・動画データ読み込み(File→Uint8List)
dart:ioパッケージのFileクラスに含まれるメソッドには、読み込み用のメソッドとして以下の2種類が用意されています。
- File.readAsString()
- File.readAsBytes()
「File.readAsString()」はデータを文字列(UTF-8などの文字エンコーディング)として読み込むもので、対象はテキストファイル(JSON, Markdown, CSV など)、返り値はFuture<String>です。
「File.readAsBytes()」はデータをバイナリデータとして読み込むもので、対象は画像・動画・音声ファイル、返り値はFuture<Uint8List>です。
今回は画像・動画ファイルを対象としているので、使うメソッドは「File.readAsBytes()」になります。
final plainBytes = await file.readAsBytes();
fileが画像・動画データ(File型)で、readAsBytesの返り値plainBytesの型は「Uint8List」です。
データの暗号化(Uint8List→Encrypted)
final key = Key.fromLength(32);
final iv = IV.fromLength(16);
final encrypter = Encrypter(AES(key))
final encrypted = encrypter.encryptBytes(plainBytes, iv: iv);
型をまとめるのが主目的なので、key,ivの取得などその他の部分は簡略化して適当に書いてます。
plainBytesがFile.readAsBytes()で読み込んだ「Uint8List」型のデータで、encryptBytesの返り値encryptedは「Encrypted」型です。
暗号化後のデータ書き込み(Encrypted→Uint8List→File)
ファイルの作成は省略します。
await File(filePath).writeAsBytes(encrypted.bytes);
Encryptedクラスはプロパティとして「bytes」を持っており、ここにバイナリデータ(Uint8List型)が入っています。
writeAsBytesの返り値は「File」型です。
Discussion