Я хочу добавить IV (вектор инициализации) 16 байтов в алгоритме AES-256 сквозное шифрование - PullRequest
0 голосов
/ 02 октября 2018

Этот код без вектора инициализации с простым AES-256 и отлично работает.Но когда я сравниваю приложение iOS, оно не одно и то же, потому что они должны дать ключ IV обязательно, чтобы шифрование совпадало в обоих приложениях.Когда я попытался добавить этот ключ IV в Android, я не получил вывод.

byte[] iv = c.getIV();
c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));

Но в этом коде я не получил, где ввести ключ 16 байтов, который предоставляется разработчиком iOS.

public class MainActivity extends AppCompatActivity {

    private EditText ed_encry;
    private EditText ed_decry;
    private Button btn_encry;
    private Button btn_decry;
    private TextView tv_key;
    private String outputString;
    String AES = "AES";
    private String password = "PGratikHadiaPGratikHadiaPGPGPGPG";

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

        ed_encry = (EditText) findViewById(R.id.ed_encry);
        btn_encry = (Button) findViewById(R.id.btn_encry);
        btn_decry = (Button) findViewById(R.id.btn_decry);
        tv_key = (TextView) findViewById(R.id.tv_key);

        btn_encry.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    outputString = encrypt(ed_encry.getText().toString());
                    tv_key.setText(outputString);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        btn_decry.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    outputString = decrypt(tv_key.getText().toString());
                    tv_key.setText(outputString);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private String decrypt(String data) throws Exception {
        SecretKeySpec key = generateKey(password);
        Cipher c = Cipher.getInstance(AES);
        c.init(Cipher.DECRYPT_MODE,key);
        byte[] decodedValue = Base64.decode(data, Base64.DEFAULT);
        byte[] decValue = c.doFinal(decodedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    private String encrypt(String data) throws Exception {
        SecretKeySpec key = generateKey(password);
        Cipher c = Cipher.getInstance(AES);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(data.getBytes());
        String encryptedValue = Base64.encodeToString(encVal, Base64.DEFAULT);
        return encryptedValue;
    }

    private SecretKeySpec generateKey(String data) throws Exception {
        final MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] bytes = data.getBytes("UTF-8");
        digest.update(bytes, 0, bytes.length);
        byte[] key = digest.digest();
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
        return secretKeySpec;
    }
}
...