package com.mobshep.brokencrypto3; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import net.sqlcipher.database.SQLiteDatabase; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class BrokenCrypto3 extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broken_crypto3); generateKey(); generateDB(this); String destinationDir = this.getFilesDir().getParentFile().getPath() + "/crypto/"; String destinationPath = destinationDir + "key.txt"; File f = new File(destinationPath); if (!f.exists()) { File directory = new File(destinationDir); directory.mkdirs(); try { copyDatabase(getBaseContext().getAssets().open("key.txt"), new FileOutputStream(destinationPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public void copyDatabase(InputStream iStream, OutputStream oStream) throws IOException { byte[] buffer = new byte[1024]; int i; while ((i = iStream.read(buffer)) > 0) { oStream.write(buffer, 0, i); } iStream.close(); oStream.close(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_broken_crypto4, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_license) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( this); // set title alertDialogBuilder.setTitle("License"); // set dialog message alertDialogBuilder .setMessage("This App is part of the Security Shepherd Project. The Security Shepherd project is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The Security Shepherd project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the Security Shepherd project. If not, see http://www.gnu.org/licenses.") .setCancelable(false) .setPositiveButton("OK",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int id) { // if this button is clicked, close // current activity dialog.cancel(); } }); // create alert dialog AlertDialog alertDialog = alertDialogBuilder.create(); // show it alertDialog.show(); return true; } if (id == R.id.action_exit) { finish(); } if (id == R.id.action_info) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( this); // set title alertDialogBuilder.setTitle("Information"); // set dialog message alertDialogBuilder .setMessage("This App has encrypted it's data using SQLCipher! This will stop hackers from stealing data on this App.") .setCancelable(false) .setPositiveButton("OK",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int id) { // if this button is clicked, close // current activity dialog.cancel(); } }); // create alert dialog AlertDialog alertDialog = alertDialogBuilder.create(); // show it alertDialog.show(); return true; } return super.onOptionsItemSelected(item); } public void generateDB(Context context) { try { SQLiteDatabase.loadLibs(context); String dbPath = context.getDatabasePath("key.db").getPath(); File dbPathFile = new File(dbPath); if (!dbPathFile.exists()) dbPathFile.getParentFile().mkdirs(); SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, "Pa88w0rd1234", null); db.execSQL("DROP TABLE IF EXISTS key"); db.execSQL("CREATE TABLE key(key VARCHAR)"); db.execSQL("INSERT INTO key VALUES('The Key is ShaveTheSkies.')"); } catch (Exception e) { // TODO Auto-generated catch block Toast error = Toast.makeText(BrokenCrypto3.this, "An error occurred.", Toast.LENGTH_LONG); error.show(); } } public void generateKey() { String destinationDir = this.getFilesDir().getParentFile().getPath() + "/crypto/encrypt/"; String destinationPath = destinationDir + "key"; File f = new File(destinationPath); if (!f.exists()) { File directory = new File(destinationDir); directory.mkdirs(); try { copyKey(getBaseContext().getAssets().open("key"), new FileOutputStream(destinationPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public void copyKey(InputStream iStream, OutputStream oStream) throws IOException { byte[] buffer = new byte[1024]; int i; while ((i = iStream.read(buffer)) > 0) { oStream.write(buffer, 0, i); } iStream.close(); oStream.close(); } }