我目前正在使用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>
答案 0 :(得分:3)
没有看到你的加密/解密例程,我只能猜测。由于您使用的是Rijndael,因此您需要确保在类上设置相同的Padding进行加密和解密。此外,请确保在加密数据时致电FlushFinalBlock。该调用未在示例中列出(虽然他们正在呼叫Close
,但应拨打FlushFinalBlock
,因此如果您在Close
上呼叫CryptoStream
,那么您应该可以)。
修改强>
我正在考虑这个问题。我认为它可能与填充有关(再次,没有看到你的代码很难说)。根据您选择的填充模式,您需要在解密后从纯文本中删除填充的字节。
答案 1 :(得分:2)
您的问题最有可能存在的地方是您在加密前读取未加密的数据库,或打开新文件以写出新解密的数据库。
作为故障排除步骤,您可以考虑将原始数据库文件作为字节读取,然后将其写出,而无需任何干预加密/解密。如果它仍然被破坏,我要检查的第一件事就是打开输出文件的编码。