在.Net中解密加密的SQLite数据库

在.Net中解密加密的SQLite数据库,.net,sqlite,sqlcipher,.net,Sqlite,Sqlcipher,我正在尝试解密加密的SQLite DB(在.Net中)。根据Zettetic的文档()可以使用sqlcipher\u export实现此目的,如下所示: var connection = new SqliteConnection(string.Format("Data Source={0}", fullDbPath)); connection.Open(); var key = //get it from somewhere va

我正在尝试解密加密的SQLite DB(在.Net中)。根据Zettetic的文档()可以使用
sqlcipher\u export
实现此目的,如下所示:

        var connection = new SqliteConnection(string.Format("Data Source={0}", fullDbPath));
        connection.Open();

        var key = //get it from somewhere
        var command = connection.CreateCommand();
        command.CommandText = "SELECT quote($password);";
        command.Parameters.AddWithValue("$password", key);
        var quotedPassword = (string)command.ExecuteScalar();

        command.Parameters.Clear();
        command.CommandText = $"PRAGMA key = {quotedPassword}; ATTACH DATABASE 'plaintext.db' AS plaintext KEY '';SELECT sqlcipher_export('plaintext');DETACH DATABASE plaintext";
        command.ExecuteNonQuery();
但是,这会引发一个异常
Microsoft.Data.Sqlite.SqliteException:“Sqlite错误1:“表”\uu EFMigrationsHistory“已存在”。


我不知道我做错了什么,有什么想法吗?

从我的测试中,代码按预期工作,它
将加密数据库导出到名为
明文.db
的新数据库文件中

由于您没有为
plaintext.db
文件提供完整路径,我不确定它是在哪里生成的,但是如果您要在attach语句中提供完整的文件路径,例如:
attach DATABASE'C:\Users\John\Data\plaintext.db'作为明文密钥'
将在该文件夹中创建一个文件
plaintext.db
,其中包含原始数据库中未加密的数据


至于您收到的异常,一定是因为导出代码被多次调用,数据库及其表已经创建,现在后续的导出调用正在尝试创建已经存在的表,但失败了。

谢谢!您是对的,我之前试图将明文数据库文件的完整路径传递给命令,但出现了一个错误,我可能弄错了什么,并假设sqlcipher将只使用与输入数据库相同的文件夹。