6

我目前正在使用 MonoTouch 和 SQLite 来确定使用加密的数据库是否比使用加密的标准 .txt 文件更好。

我正在尝试使用RijndaelManaged和其他System.Security.Cryptography方法来加密我的 SQLite DB,但 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))

这会使数据库损坏且无法使用。有谁知道为什么会这样?谁能帮我在不使用 SQLCipher 的情况下加密这个数据库?

编辑:我尝试将原始数据库读取为字节,并尝试将字节转换为字符串,但无论我使用什么编码,第一行之后我都会得到 \0。

4

2 回答 2

3

在没有看到您的加密/解密例程的情况下,我只能猜测。由于您使用的是 Rijndael,因此您需要确保在类上设置相同的Padding以进行加密和解密。此外,请确保在加密数据时调用FlushFinalBlock 。该调用未在示例中列出(尽管他们正在调用Closewhich should call FlushFinalBlock,因此如果您在调用Closethe ,CryptoStream那么您应该可以在那里)。

编辑
我在想更多。我认为这可能与填充有关(同样,没有看到你的代码很难说)。根据您选择的填充模式,您需要在解密后从纯文本中剥离填充字节。

于 2012-08-08T17:28:35.420 回答
2

您的问题最可能存在的地方是当您在加密之前读取未加密的数据库,或者打开一个新文件以写出新解密的数据库时。

作为故障排除步骤,您可以考虑以字节形式读取原始数据库文件,然后将其写出,而无需任何干预加密/解密。如果它仍然损坏,我首先要检查的是您打开输出文件时使用的编码。

于 2012-07-31T02:29:29.003 回答