package com.powerpoint45.dtube; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.security.KeyPairGeneratorSpec; import android.util.Base64; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.KeyStore; import java.security.interfaces.RSAPublicKey; import java.util.ArrayList; import java.util.Calendar; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.security.auth.x500.X500Principal; /** * Created by michael on 18/11/17. */ class Encryption { Context c; Encryption(Context c){ this.c = c; } private void createNewKeys(String alias, KeyStore keyStore) { try { // Create new key if needed if (!keyStore.containsAlias(alias)) { Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); end.add(Calendar.YEAR, 1); KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(c.getApplicationContext()) .setAlias(alias) .setSubject(new X500Principal("CN=Michael Kern (immawake), O=powerpoint45")) .setSerialNumber(BigInteger.ONE) .setStartDate(start.getTime()) .setEndDate(end.getTime()) .build(); KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); generator.initialize(spec); KeyPair keyPair = generator.generateKeyPair(); } } catch (Exception e) { e.printStackTrace(); } } void encryptString(String alias, String data) { try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); createNewKeys(alias,keyStore); KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null); RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey(); Cipher input = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL"); input.init(Cipher.ENCRYPT_MODE, publicKey); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); CipherOutputStream cipherOutputStream = new CipherOutputStream( outputStream, input); cipherOutputStream.write(data.getBytes("UTF-8")); cipherOutputStream.close(); byte [] vals = outputStream.toByteArray(); SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(c); sharedPref.edit().putString("cypher", Base64.encodeToString(vals, Base64.DEFAULT)).apply(); } catch (Exception e) { e.printStackTrace(); } } String decryptString(String alias) { try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null); Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding"); output.init(Cipher.DECRYPT_MODE, privateKeyEntry.getPrivateKey()); SharedPreferences sharedPref =PreferenceManager.getDefaultSharedPreferences(c); String cipherText = sharedPref.getString("cypher",null); CipherInputStream cipherInputStream = new CipherInputStream( new ByteArrayInputStream(Base64.decode(cipherText, Base64.DEFAULT)), output); ArrayList<Byte> values = new ArrayList<>(); int nextByte; while ((nextByte = cipherInputStream.read()) != -1) { values.add((byte)nextByte); } byte[] bytes = new byte[values.size()]; for(int i = 0; i < bytes.length; i++) { bytes[i] = values.get(i).byteValue(); } String finalText = new String(bytes, 0, bytes.length, "UTF-8"); return finalText; } catch (Exception e) { e.printStackTrace(); } return null; } }