Как зашифровать с помощью AES android - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу зашифровать строку с секретным ключом и Iv.Но я не получаю правильное шифрование.Кто-нибудь может сказать мне, как это сделать.Моя строка abc, но когда она расшифровывается, в ней содержатся специальные символы.я перешел по этой ссылке: https://www.cuelogic.com/blog/using-cipher-to-implement-cryptography-in-android/

package com.reshhhjuuitos.mhhhkoiyrestos.footer;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class MCrypt {
    private String iv = "1234567890123456";            // Dummy iv (CHANGE IT!)
    private IvParameterSpec ivspec;
    private SecretKeySpec keyspec;
    private Cipher cipher;
    private String SecretKey = "1&BZ6pqSu1w2%7!8w0oQHJ7FF79%+MO2";
    public MCrypt() {
        ivspec = new IvParameterSpec(iv.getBytes());
        keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");

        try {
            //cipher = Cipher.getInstance("AES/CBC/NoPadding");
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }
    }
    public byte[] encrypt(String text) throws Exception {
        if (text == null || text.length() == 0)
            throw new Exception("Empty string");

        byte[] encrypted = null;
        try {
// Cipher.ENCRYPT_MODE = Constant for encryption operation mode.
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

            encrypted = cipher.doFinal(padString(text).getBytes("UTF-8"));
        } catch (Exception e) {
            throw new Exception("[encrypt] " + e.getMessage());
        }
        return encrypted;
    }
    private static String padString(String source) {
        char paddingChar = 0;
        int size = 16;
        int x = source.length() % size;
        int padLength = size - x;
        for (int i = 0; i < padLength; i++) {
            source += paddingChar;
        }
        return source;
    }
    public static byte[] hexToBytes(String str) {
        if (str == null) {
            return null;
        } else if (str.length() < 2) {
            return null;
        } else {

            int len = str.length() / 2;
            byte[] buffer = new byte[len];
            for (int i = 0; i < len; i++) {
                buffer[i] = (byte) Integer.parseInt(
                        str.substring(i * 2, i * 2 + 2), 16);

            }
            return buffer;
        }
    }
    public static String byteArrayToHexString(byte[] array) {
        StringBuffer hexString = new StringBuffer();
        for (byte b : array) {
            int intVal = b & 0xff;
            if (intVal < 0x10)
                hexString.append("0");
            hexString.append(Integer.toHexString(intVal));
        }
        return hexString.toString();
    }
    public byte[] decrypt(String text) throws Exception {
        if (text == null || text.length() == 0)
            throw new Exception("Empty string");

        byte[] decrypted = null;
        try {
// Cipher.DECRYPT_MODE = Constant for decryption operation mode.
            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            decrypted = cipher.doFinal(hexToBytes(text));
        } catch (Exception e) {
            throw new Exception("[decrypt] " + e.getMessage());
        }
        return decrypted;
    }
}

MainACTVITIY.JAVA

MCrypt mycrypt = new MCrypt();
        String dummyStr = "abc";
        try {
            String encryptedStr = mycrypt.byteArrayToHexString(mycrypt.encrypt(dummyStr));
            String decryptedStr = new String(mycrypt.decrypt(encryptedStr));
            Log.v("Tag_en",""+encryptedStr);
            Log.v("Tag_de",""+decryptedStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

вывод: Tag_en: 5b49ac218b93ee5315c25a0e40b3e9de42e6ecadf0827062b22d4421da99dc5a Tag_de: abc�������������

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

попробуй этот код, у меня работает

private final String AES_MODE = "AES/CBC/PKCS7Padding";

private byte[] Encryption(final SecretKeySpec key, final byte[] iv, final byte[] message) throws GeneralSecurityException {
    final Cipher cipher = Cipher.getInstance(AES_MODE);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] cipherText = cipher.doFinal(message);
    return cipherText;
}
0 голосов
/ 18 сентября 2018

Хорошо, я думал, что это может быть ваш шестнадцатеричный кодировщик / декодер, но они работают. Поэтому я написал быстрое шифрование и проверил его на соответствие вашему классу.

Проблема в том, что вы прокладываете. Я не понимаю, почему вы дополняете свою строку до длины 16, но это нуль-символы, которые вы добавили к вашей строке, которые нельзя распечатать. Так что либо не дополняйте строку, либо обнуляйте нулевые значения во время расшифровки, чтобы восстановить точную строку, которую вы зашифровали.

Для ясности, удобства обслуживания и повторного использования вы должны действительно выполнить только одну четкую логическую операцию в каждом из ваших методов, то есть заполнение должно быть выполнено до того, как вы передадите строку в метод шифрования, поэтому метод шифрования просто шифрует.

0 голосов
/ 18 сентября 2018

Вы можете использовать такие функции:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
}

И вызывать их так:

ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); // bm is the bitmap object   
byte[] b = baos.toByteArray();  

byte[] keyStart = "this is a key".getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();    

// encrypt
byte[] encryptedData = encrypt(key,b);
// decrypt
byte[] decryptedData = decrypt(key,encryptedData);

Это должно работать, сейчас я использую похожий код в проекте.

...