Декодирование текста base64 с помощью AES-128-ECB (NO PADDING) с хешем md5 в качестве ключа - PullRequest
0 голосов
/ 24 ноября 2018

Итак, у меня есть проблема, которую я не могу решить.Мне нужно декодировать некоторый текст Base64, используя сгенерированный хэш md5 в качестве ключа.Я написал этот код.Вывод не выходит читабельным.Ключи "freeforall" и "validate" являются действительными.

Может кто-нибудь подсказать мне, что не так с этим кодом?Или, возможно, с моей интерпретацией проблемы.

private String decrypt(String data, byte[] key) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] original = cipher.doFinal(Base64.decode(data));
    return new String(original, "UTF-8").trim();
}

private byte[] getMD5(String value) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(value.getBytes("utf-8"), 0, value.length());
    return md.digest();
}

public static void main(String[] args) {
     String grupo0 = "r8Z48nEsKskL+9mOb9EQ519MLNjeFkcTQe3M4+XMdmkWZ+7F3o027zOwuMpyr1XQKFDSILDSUxUhAIoDW4QcnoA0um0BKs4sA/ZczucCAEjCpQmy4xR3o+xR1Ve3bNV6/X3hq98hrlCdycgEwprn8qvQRAHwpA1FqseBl2NCuo+vn5VZA0GHKnuNPiApjCMDo6qpTIELy9FB+2vWZwYprA==";
     String grupoMenos1 = "fGpu3YkXGxTdVTeHhC2FZT9utUOGJgvvmPlzlEq39oSTc419ashyqmBvYGSC7BqRvXQ3Wx+i8C7jIiaBo9fXAd/JLed+T6XvlSkJfH+PGX8xi8tuD+OoLhaA102mscVSatsKtGTzOWAt17DzWeLe2QKXbClN+ElGSQaPBRD/aHpNQJNAMrUOUEgPDNjbb7HmlmOfFsCpQZOEFq+n2SOMpA==";
     System.out.println(decrypt(grupo0, getMD5("freeforall")));
     System.out.println(decrypt(grupoMenos1, getMD5("validate")));
}

1 Ответ

0 голосов
/ 24 ноября 2018

Не имея возможности увидеть код, используемый для шифрования, невозможно определить, правильно ли вы поступаете.У меня очень похожий код в приложении для Android, и он отлично работает.Разница лишь в том, что я передаю javax.crypto.spec.IvParameterSpec на Cipher.init().Кроме того, класс Android Base64 принимает аргумент flags для decode(), но я не думаю, что это ваша проблема здесь.

У вас также есть небольшая ошибка в вашей функции getMD5(), но она не должна бытьпроблема здесь, так как ваши ключи просты ASCII.Вы должны использовать длину байтового массива UTF-8, а не длину исходной строки при расчете дайджеста.

md.update(value.getBytes("utf-8"), 0, value.length());

Должно быть:

byte [] valueBytes = value.getBytes("utf-8");
md.update(valueBytes, 0, valueBytes.length);

РЕДАКТИРОВАТЬ: как Джеймс КПолк предложил, вы могли бы просто сделать:

md.update(value.getBytes("utf-8"));
...