ここsqlcipher_export()
で指定されているとおりに を使用して、既存の Sqlite データベースを暗号化しました。すべてうまくいきました - エラーはありません。結果のデータベースが作成され、適切なサイズになります。ただし、 を使用して正しいキーを指定しても、暗号化されたデータベースを開くことができません。暗号化されていないデータベースは問題なく開きます。PRAGMA key
さらに、暗号化されたデータベースは奇妙に見えます。ヘッダーは暗号化されているようですが、データは暗号化されていません。http://i.stack.imgur.com/HaBpS.pngを参照してください。暗号化されたデータベース (左) と暗号化されていないデータベース (右) のバイナリ比較を示す画像です。
デバッガーでは、暗号化中にプログラムが通過することを確認できますが、sqlcipher_page_cipher()
ほとんどの場合 (2 回の呼び出しを除く)、次の句が実行され、関数は早期に戻ります。
/* just copy raw data from in to out when key size is 0
* i.e. during a rekey of a plaintext database */
if(c_ctx->key_sz == 0) {
memcpy(out, in, size);
return SQLITE_OK;
}
暗号化中に発行された SQL:
ATTACH DATABASE 'encrypted.db' AS encrypted KEY '12345';
SELECT sqlcipher_export('encrypted');
DETACH DATABASE encrypted;
オープン中に発行された SQL:
// open database
PRAGMA key = '12345';
// try to read database - "file is encrypted or not a database"
暗号化および復号化中に生成された CODEC_TRACE ログはこちら.
(Sqlcipher をどのようにコンパイルしたかが重要な場合: Linux マシンで Sqlcipher 融合を作成し、結果の C ファイルを Windows マシンにコピーし、Visual C++ Express でコンパイルし、コンパイル済みの OpenSSL DLL にリンクしました。)