Place fixed cryptographic key

1

The code below is working perfectly for both encryption and decryption, however, when I close the app and put the generated code before it closes it (I open the cryptographic app one word and I close the app and when I go back to decipher the message).

It happens that it does not work when I do this and my intention is that it works, both closing and opening to another cell that has the same APP installed.

I think you should put a fixed key instead of "SecretKeySpec" .

But I'm not sure how to implement a way to leave the fixed cryptographic key instead of being generated would be by ex "123" , so that I could decipher the message generated from any other cell with the app or from the same cell phone (in the case close and open).

import android.util.Base64;

import java.security.MessageDigest;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * Created by thiago.goncalves on 22/02/2016.
 */
public class Encripta {

    private final Cipher cipher;
    private  final SecretKeySpec key ;
    private AlgorithmParameterSpec spec;
    public static final String SEED_16_CHARACTER = "U1MjU1M0FDOUZ.Qz";


    public Encripta() throws Exception {
        // hash password with SHA-256 and crop the output to 128-bit for key
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update(SEED_16_CHARACTER.getBytes("UTF-8"));
        byte[] keyBytes = new byte[32];
        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);



        cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        key = new SecretKeySpec(keyBytes, "AES");

        byte[] key  = "secret".getBytes();
      //  String IV     = "12345678";
        spec = getIV();
    }

    public AlgorithmParameterSpec getIV() {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
        IvParameterSpec ivParameterSpec;
        ivParameterSpec = new IvParameterSpec(iv);

        return ivParameterSpec;
    }



    public String encrypt(String plainText) throws Exception {

        cipher.init(Cipher.ENCRYPT_MODE, key, spec);
        byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
        String encryptedText = new String(Base64.encode(encrypted,
                Base64.DEFAULT), "UTF-8");

        return encryptedText;
    }

    public String decrypt(String cryptedText) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, key, spec);
        byte[] bytes = Base64.decode(cryptedText, Base64.DEFAULT);
        byte[] decrypted = cipher.doFinal(bytes);
        String decryptedText = new String(decrypted, "UTF-8");

        return decryptedText;
    }

}
    
asked by anonymous 24.02.2016 / 15:37

1 answer

1

Actually your key is already fixed!

Note that to create your SecretKeySpec, you use the bytes of SEED_16_CHARACTER .

Summarizing the counter:

//cria um MessageDigest de SHA-256
 MessageDigest digest = MessageDigest.getInstance("SHA-256");
// pega os bytes de sua chave
final byte[] seedBytes = SEED_16_CHARACTER.getBytes("UTF-8”);
// set no digest
digest.update(seedBytes);

cipher = Cipher.getInstance("AES/CBC/PKCS7Padding”);
// cria uma chave com os bytes da chave
key = new SecretKeySpec(seedBytes, "AES");

I did some testing, and here it worked perfectly, I encrypted it in one and decrypted it in another one without problems!

Follow the test:

Encrypta.java

public class Encrypta {

    private final Cipher cipher;
    private  final SecretKeySpec key ;
    private AlgorithmParameterSpec spec;
    public static final String SEED_16_CHARACTER = "Olá Mundo 12345";


    public Encrypta() throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        final byte[] seedBytes = SEED_16_CHARACTER.getBytes("UTF-8");
        digest.update(seedBytes);
        cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        key = new SecretKeySpec(seedBytes, "AES");
        spec = getIV();
    }

    public AlgorithmParameterSpec getIV() {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivParameterSpec;
        ivParameterSpec = new IvParameterSpec(iv);

        return ivParameterSpec;
    }



    public String encrypt(String plainText) throws Exception {

        cipher.init(Cipher.ENCRYPT_MODE, key, spec);
        byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
        String encryptedText = new String(Base64.encode(encrypted,
                Base64.DEFAULT), "UTF-8");

        return encryptedText;
    }

    public String decrypt(String cryptedText) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, key, spec);
        byte[] bytes = Base64.decode(cryptedText, Base64.DEFAULT);
        byte[] decrypted = cipher.doFinal(bytes);
        String decryptedText = new String(decrypted, "UTF-8");
        return decryptedText;
    }

}

MainActivity.java

public class MainActivity extends AppCompatActivity {


    private EditText editText;
    private EditText textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = EditText.class.cast(findViewById(R.id.editText));
        textView = EditText.class.cast(findViewById(R.id.textView));
        Button.class.cast(findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                encripta();
            }
        });
        Button.class.cast(findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                desencripta();
            }
        });
    }


    private void desencripta(){
        final String txt = editText.getText().toString();
        try {
            final Encrypta encrypta = new Encrypta();
            String result = encrypta.decrypt(txt);
            textView.setText(result);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
    private void encripta(){
        final String txt = editText.getText().toString();
        try {
            final Encrypta encrypta = new Encrypta();
            String result = encrypta.encrypt(txt);
            textView.setText(result);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ceabs.library.shared.MainActivity">


    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView"
        android:layout_below="@+id/editText"
        android:layout_alignParentStart="true"
        android:layout_alignEnd="@+id/editText" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        android:id="@+id/button"
        android:layout_below="@+id/textView"
        android:layout_alignParentStart="true"
        android:layout_marginTop="81dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:id="@+id/button2"
        android:layout_alignBottom="@+id/button"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

If you still can not, check the Strings being generated to see if there is any difference.

    
24.02.2016 / 20:29