包含垃圾字符的SQLite文件

时间:2012-07-30 14:05:13

标签: c# .net sqlite xamarin.ios

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

我正在尝试使用RijndaelManaged和其他System.Security.Cryptography方法来加密我的SQLite数据库,但数据库已损坏。

我发现了问题,但不知道为什么会发生这种问题或如何解决问题。这是一个带有单个表的基本SQLite文件:

SQLite format 3@  -‚

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

使用example online并加密此数据库后,我得到了这个:

SQLite format 3@  -�

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

这使数据库损坏并且无法使用。有谁知道为什么会这样?任何人都可以帮助我加密这个数据库而不使用SQLCipher吗?

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

2 个答案:

答案 0 :(得分:3)

没有看到你的加密/解密例程,我只能猜测。由于您使用的是Rijndael,因此您需要确保在类上设置相同的Padding进行加密和解密。此外,请确保在加密数据时致电FlushFinalBlock。该调用未在示例中列出(虽然他们正在呼叫Close,但应拨打FlushFinalBlock,因此如果您在Close上呼叫CryptoStream,那么您应该可以)。

修改
我正在考虑这个问题。我认为它可能与填充有关(再次,没有看到你的代码很难说)。根据您选择的填充模式,您需要在解密后从纯文本中删除填充的字节。

答案 1 :(得分:2)

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

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