📑

[Flutter][暗号化]画像・動画の読み込み書き込み時のファイル形式

に公開

画像・動画ファイルを暗号化する流れの中で、「List<int>」やら「Uint8List」やらファイル形式が色々出てきて訳がわからなくなったので、手順を自分なりにまとめます。

全体の流れ

  1. 暗号化前の元画像・動画データ読み込み
  2. データの暗号化
  3. 暗号化後のデータを書き込むためのファイル作成
  4. 3で作成したファイルに暗号化後のデータ書き込み
  5. 元データの削除

全体の流れは上記の通りです。

バイナリデータとは

本題に入る前にバイナリデータについて触れておきます。
バイナリデータとは、コンピュータが直接理解・処理できる、0と1の2進数で表現されたデータのことで、実行形式のプログラム、画像、音声、動画データはこの形式で表されます。

元画像・動画データ読み込み(File→Uint8List)

dart:ioパッケージのFileクラスに含まれるメソッドには、読み込み用のメソッドとして以下の2種類が用意されています。

  1. File.readAsString()
  2. 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