@Billy_Milligan

Как перевести byte[] в String, а затем обратно в byte[]?

Решил реализовать резервное копирование из БД андройда на сервер (все данные хранятся в зашифрованном виде) и чтобы можно было в случае чего выгрузить всё с сервера обратно.

Шифрую строку вот так:
public static byte[] encrypt(String text) throws Exception {
        byte[] clear = text.getBytes("UTF-8");
        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
        sr.setSeed(password);
        kgen.init(256, sr);
        SecretKey skey = kgen.generateKey();
        byte[] key = skey.getEncoded();

        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
        byte[] encrypted = cipher.doFinal(clear);
        return encrypted;
    }


После этого мне нужно передать её на сервер POST'ом, но функция библиотеки JSON для отправки запроса принимает только String. По этому сначала попробовал сделать так:

byte[] passBytes = new byte[0];

        try {
            passBytes = mAES.encrypt("test");
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            a = mAES.decrypt(passBytes.toString().getBytes(Charset.forName("UTF-8"))); //без параметра charset тоже пробовал
        } catch (Exception e) {
            e.printStackTrace();
        }


Расшифровать не получается, выкидывает exception.
При шифровании/рашифровании byte[] всё нормально.
3 день уже бьюсь с этим.
Также пробовал переводить вот так.

byte[] passBytes = new byte[0];
        StringBuffer sb = new StringBuffer();

        try {
            passBytes = mAES.encrypt("text");
        } catch (Exception e) {
            e.printStackTrace();
        }

        for (int i = 0; i < passBytes.length; i++) {
            sb.append(Integer.toString((passBytes[i] & 0xff) + 0x100, 16).substring(1));
        }

        try {
            a = mAES.decrypt(sb.toString().getBytes(Charset.forName("UTF-8")));
        } catch (Exception e) {
            e.printStackTrace();
        }
  • Вопрос задан
  • 3745 просмотров
Решения вопроса 1
@Billy_Milligan Автор вопроса
Нашёл решение, может кому то пригодится.

public Test () {
        String a = "";
        try {
            a = bytesToHex(mAES.encrypt("test"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            a = mAES.decrypt(hexToBytes(a));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

public static String bytesToHex(byte[] data) {
        if (data==null)
        {
            return null;
        }

        int len = data.length;
        String str = "";
        for (int i=0; i<len; i++) {
            if ((data[i]&0xFF)<16)
                str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);
            else
                str = str + java.lang.Integer.toHexString(data[i]&0xFF);
        }
        return str;
    }


    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;
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
06 мая 2024, в 09:38
1200 руб./в час
06 мая 2024, в 09:37
1200 руб./в час
06 мая 2024, в 09:36
8000 руб./за проект