使用AES的SQLite数据库解密

莫森

我想我的资料加密基地和使用的答案将它保存到SD卡这一职位。但是问题是,当我将文件放回databases应用程序包文件夹中时,它无法被读取SQLiteOpenHelper错误 :

  • 08-30 10:58:35.692:E / SQLiteLog(3801):(26)文件已加密或不是数据库

  • 08-30 10:58:35.692:E / DefaultDatabaseErrorHandler(3801):sqlite报告数据库损坏:/data/data/com.padra_tech.karamad/databases/PrimaryInformation

  • 08-30 10:58:35.692:E / DefaultDatabaseErrorHandler(3801):!@创建.back文件

这是我的课:

package dataBases;


public class BackupHelper {

public static int SECURITY_NONE = 1 ;
public static int SECURITY_ENCRYPTED = 2 ;

public static void backup(Context context, int securityMode) {
    
    File backup = new File(Environment.getExternalStorageDirectory()+ 
            "/" + "KarAmad" + "/" + "backup");
    backup.mkdirs();
    
    List<File> src = new ArrayList<File>();
    List<File> dst = new ArrayList<File>();
    
    
    try {
        src.add( new File(new PrimaryInformationDataBase(context).getDirectory()) );
        dst.add( new File(backup.getPath() + "/" + "PI") );
        
        src.add( new File(new TransactionDataBase(context).getDirectory()) );
        dst.add( new File(backup.getPath() + "/" + "T") );
        
        src.add( new File(new NoteDataBase(context).getDirectory()) );
        dst.add( new File(backup.getPath() + "/" + "N") );
        
        src.add( new File(new PictureDataBase(context).getDirectory()) );
        dst.add( new File(backup.getPath() + "/" + "P") );
        
        for(int i = 0 ; i < src.size() ; i ++) {
            dst.get(i).createNewFile();
            if(securityMode == SECURITY_ENCRYPTED)
                BackupHelper.encrypt(src.get(i), dst.get(i));
            else
                LeftFragment.copy(src.get(i), dst.get(i));
        }
        
        Toast.makeText(context, "پشتیبان گیری انجام شد", Toast.LENGTH_SHORT).show();
        
    } catch (Exception e) {
        
        Toast.makeText(context, "پشتیبان گیری انجام نشد!", Toast.LENGTH_SHORT).show();
        e.printStackTrace();

    }
}

public static void restore(Context context, int securityMode) {
    
    NoteDataBase dummyNoteDataBase = new NoteDataBase(context);
    String temp = dummyNoteDataBase.getDirectory();
    String dataBasesPath = temp.substring(0, temp.lastIndexOf("/"));
    
    File source = new File(Environment.getExternalStorageDirectory()+ 
            "/" + "KarAmad" + "/" + "backup");
    
    List<File> src = new ArrayList<File>();
    List<File> dst = new ArrayList<File>();
    
    try {
        src.add( new File(source.getPath() + "/" + "PI") );
        dst.add( new File(dataBasesPath + "/" + "PrimaryInformation") );
        
        src.add( new File(source.getPath() + "/" + "T") );
        dst.add( new File(dataBasesPath + "/" + "Transaction") );
        
        src.add( new File(source.getPath() + "/" + "N") );
        dst.add( new File(dataBasesPath + "/" + "Note") );
        
        src.add( new File(source.getPath() + "/" + "P") );
        dst.add( new File(dataBasesPath + "/" + "Picture") );
        
        for(int i = 0 ; i < src.size() ; i++) {
            
            dst.get(i).createNewFile();
            
            if(securityMode == SECURITY_ENCRYPTED)
                BackupHelper.decrypt(src.get(i), dst.get(i));
            else
                LeftFragment.copy(src.get(i), dst.get(i));
        }
        
        
        
        Toast.makeText(context, "بازیابی فایل پشتیبان انجام شد", Toast.LENGTH_SHORT).show();
        
    } catch (Exception e) {
        
        Toast.makeText(context, "بازیابی فایل پشتیبان انجام نشد!", Toast.LENGTH_SHORT).show();
        e.printStackTrace();

    }
}

public static void encrypt(File src, File dst) throws IOException,
    NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
    
    FileInputStream inputStream = new FileInputStream(src);
    FileOutputStream outputStream = new FileOutputStream(dst);
    
    SecretKeySpec keySpec = new SecretKeySpec("1393032613930326".getBytes(), "AES");
    
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, keySpec);
    
    CipherOutputStream cipherOutputStream = 
            new CipherOutputStream(outputStream, cipher);
    
    int b;
    byte[] d = new byte[8];
    while((b = inputStream.read(d)) > 0) {
        cipherOutputStream.write(d, 0, b);
    }
    
    cipherOutputStream.flush();
    cipherOutputStream.close();
    inputStream.close();
}


public static void decrypt(File src, File dst) throws IOException,
NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {

    FileInputStream inputStream = new FileInputStream(src);
    FileOutputStream outputStream = new FileOutputStream(dst);

    SecretKeySpec keySpec = new SecretKeySpec("1393032613930326".getBytes(), "AES");

    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, keySpec);

    CipherInputStream cipherOutputStream = 
            new CipherInputStream(inputStream, cipher);

    int b;
    byte[] d = new byte[8];
    while((b = inputStream.read(d)) > 0) {
        outputStream.write(d, 0, b);
    }

    outputStream.flush();
    outputStream.close();
    cipherOutputStream.close();

}
}
亨利

decrypt方法从而inputStream不是从错误的名称读取cipherOutputStream因此,您只是制作一个副本,而不是解密数据库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Powershell读取/解密chrome sqlite数据库中的encryption_value列?

来自分类Dev

如何使用python 3在SQLite数据库中解密项目

来自分类Dev

Android加密/解密sqlite数据库100%安全

来自分类Dev

如何从数据库获取解密的数据?

来自分类Dev

使用参数插入SQLite数据库

来自分类Dev

使用游标检索SQLite数据库

来自分类Dev

使用gnuplot绘制sqlite数据库

来自分类Dev

使用SQLite的Android数据库错误

来自分类Dev

使用gnuplot绘制sqlite数据库

来自分类Dev

对Sqlite使用通用数据库

来自分类Dev

使用SQlite数据库创建arrayList

来自分类Dev

使用 SearchView 搜索 SQLite 数据库

来自分类Dev

使用python的sqlite数据库错误

来自分类Dev

使用 SaveFileDialog 备份 SQLite 数据库?

来自分类Dev

SQLite 数据库

来自分类Dev

添加MCrypt的AES-CBC加密后,数据未保存到数据库中或未正确解密

来自分类Dev

Android上的Whatsapp数据库解密

来自分类Dev

Android上的Whatsapp数据库解密

来自分类Dev

Realm 数据库解密失败

来自分类Dev

使用 Powershell 从 PyCrypto 解密 AES CBC 数据

来自分类Dev

如何使用FMDB在SQLite数据库中保存数据?

来自分类Dev

使用C#将数据插入SQLite数据库

来自分类Dev

如何使用AND条件更新SQLite数据库中的数据?

来自分类Dev

如何使用sqlite从数据库访问数据

来自分类Dev

数据未使用SQLite从数据库中删除

来自分类Dev

无法使用python从sqlite数据库获取数据

来自分类Dev

LocalStorage与Sqlite数据库

来自分类Dev

读取sqlite数据库

来自分类Dev

SQLite数据库分区