暗号化ファイルのアーカイブ化


これはSiv3D AdventCalendar 2017 18日目の記事です。

概要

暗号化したファイルのアーカイブから、復号したデータを読み込む機能を作成しました。
また、指定したフォルダを暗号化してアーカイブファイルを作成する機能も作成しました。

ここでソースコードを公開しています。

利用方法

CryptoArchive::Create

暗号化アーカイブの作成
CryptoArchive::Create(L"アーカイブ化したいフォルダパス", L"アーカイブの出力パス", AES128Key);

指定したフォルダをアーカイブ化する関数です。AES128Keyで指定した鍵で暗号化を行います。
作成したアーカイブ内の、フォルダとファイルの構成は元の構成と同じになります。


元フォルダの構成 Example/Siv3D-kun.png
アーカイブの構成 Example/Siv3D-kun.png

ArchiveCryptoFile

暗号化アーカイブの読み込み
ArchiveCryptoFile file(L"アーカイブファイルパス", AES128Key);
Texture texture(file.load(L"アーカイブ内のファイルパス"));

ArchiveCryptoFileで作成したアーカイブを読み込む機能です。
コンストラクタで読み込むアーカイブファイルと鍵を指定します。
指定する鍵は、アーカイブ化する際に使用したものと同じ鍵です。

ArchiveCryptoFile::loadでアーカイブ内のファイルを読み込みます。

補足

コンストラクタでアーカイブファイルと鍵をしていない場合、loadは指定されたファイルのデータを読み込むようになります。

コンストラクタを指定しない場合
ArchiveCryptoFile file;
Texture texture(file.load(L"ファイルパス")); //ファイルパスで指定したファイルを読み込んでくる

この機能により、読み込み先の変更が容易になります。

読み込み先の切り替え
//アーカイブファイルの読み込み
ArchiveCryptoFile file(L"./Example.ecp", AES128Key(0, 0));
Texture texture(file.load(L"./Example/Siv3D-kun.png")); //Example.ecpアーカイブ内のSiv3D-kun.pngを読み込む

//通常のファイルの読み込み
ArchiveCryptoFile file;
Texture texture(file.load(L"./Example/Siv3D-kun.png")); //ExampleフォルダのSiv3D-kun.pngを読み込む

以下作成した動機や、使用した機能などの説明

背景

Siv3Dで作成したプロジェクトを公開する際に、画像ファイルや設定ファイルなども一緒に添付すると思います。
しかし、ファイルの数が増えると圧縮・解凍に時間がかかったり、編集されたくないファイルを編集されるなどの問題があります。

ファイル数が増えた場合にはアーカイブファイルを作成し、編集されたくないファイルは暗号化すれば解決します。
だけど、いちいち行うのはちょっとめんどくさいので、今回それらを一括して行える機能を作成しました。

アーカイブファイルについて

Siv3Dでは "Archive::Create" と "FileArchive" でアーカイブファイルが操作できます。(リファレンス)

しかし、これで作成したできるアーカイブファイルには元のデータがそのまま記載されています。
以下の画像は作成したアーカイブファイルを、バイナリエディタで開いたものです。

フォルダ構成
Siv3Dアーカイブ
┗テキストファイル.txt

「Siv3Dアーカイブ」フォルダをアーカイブ化したのですが、その中の「テキストファイル.txt」に記載した文章が見えてしまっています。
このようにただアーカイブ化するだけでは、データを編集される可能性があります。

今回作成した機能

今回は、暗号化したファイルをアーカイブ化し、それからデータを読み取る機能を作成しました。
以下の画像は今回の機能でアーカイブ化したファイルをバイナリエディタで開いたものです。

フォルダ構成
Siv3Dアーカイブ
┗テキストファイル.txt

ファイル名は見えてしまっていますが、「テキストファイル.txt」に記載した文章は意味の分からないものになっています。