6

私は現在、MonoTouch と SQLite を使用して、暗号化されたデータベースを使用することが、暗号化された標準の .txt ファイルよりも優れているかどうかを判断しています。

RijndaelManagedおよびその他の方法を使用して SQLite DB を暗号化しようとしていますSystem.Security.Cryptographyが、DB が破損しています。

私は問題を発見しましたが、なぜそれが起こっているのか、それを修正する方法がわかりません。これは、単一のテーブルを持つ基本的な SQLite ファイルです。

SQLite format 3@  -‚

øø?gtablenewnewCREATE TABLE new (id int(5), name vchar(255))

オンラインの例を使用し、このデータベースを暗号化すると、次のようになります。

SQLite format 3@  -�

��?gtablenewnewCREATE TABLE new (id int(5), name vchar(255))

これにより、DB が破損し、使用できなくなります。なぜこれが起こるのか誰にも分かりますか?SQLCipherを使用せずにこのDBを暗号化するのを手伝ってくれる人はいますか?

編集:生のDBをバイトとして読み込んで、バイトを文字列に変換しようとしましたが、使用するエンコーディングに関係なく、最初の行の後に \0 が表示されます。

4

2 に答える 2

3

あなたの暗号化/復号化ルーチンを見なければ、私は推測することしかできません. Rijndael を使用しているため、暗号化と復号化のためにクラスに同じパディングを設定していることを確認する必要があります。また、データを暗号化するときは、必ずFlushFinalBlockを呼び出してください。その呼び出しはサンプルにリストされていません (ただし、 を呼び出すClose必要がある呼び出しを行っているため、 を呼び出してFlushFinalBlockいる場合は、そこで問題ないはずです)。CloseCryptoStream

編集
私はこれについてもっと考えていました。パディングに関連している可能性があると思います(繰り返しますが、コードを見ずに言うのは難しいです)。選択したパディング モードによっては、復号化後にプレーン テキストからパディングされたバイトを削除する必要があります。

于 2012-08-08T17:28:35.420 に答える
2

問題が発生する可能性が最も高いのは、暗号化の前に暗号化されていないデータベースを読み取っているとき、または新しいファイルを開いて新しく復号化されたデータベースを書き出すときです。

トラブルシューティングの手順として、未加工のデータベース ファイルをバイトとして読み込んでから、暗号化/復号化を介在させずに書き出すことを検討してください。それでも破損する場合は、最初にチェックするのは、出力ファイルを開く際のエンコーディングです。

于 2012-07-31T02:29:29.003 に答える