Получение входного текста обратно из MessageDigest

Здесь, на SO, много людей, которые предлагают разные подходы к проблеме, которая у меня есть, но ни один из них, похоже, не работает для меня. В настоящее время я тестирую сервер меток времени и (помимо прочего, я отправляю серверу сообщение), и мне нужно прочитать, что сообщение существует в ответе. Итак, я создаю запрос и готовлю его:

MessageDigest digest = MessageDigest.getInstance("SHA1");
String s = "Trolololoooo";
DigestInputStream stream = new DigestInputStream(new ByteArrayInputStream(s.getBytes("UTF-8")), digest)
byte[] digest2 = stream.getMessageDigest().digest();

// timestamp stuff is all org.bouncycastle.tsp.*
TimeStampRequestGenerator timeStampRequestGenerator = new TimeStampRequestGenerator();
timeStampRequestGenerator.setReqPolicy(String.valueOf(new ASN1ObjectIdentifier("1.3.6.1.4.1.13762.3")));
TimeStampRequest timeStampRequest = timeStampRequestGenerator.generate(TSPAlgorithms.SHA1, digest2, BigInteger.valueOf(666));
byte request[] = timeStampRequest.getEncoded();

... пропустил отправляющую часть, хорошо получил ответ

InputStream in = con.getInputStream();
TimeStampResp resp = TimeStampResp.getInstance(new ASN1InputStream(in).readObject());
TimeStampResponse response = new TimeStampResponse(resp);
response.validate(timeStampRequest);

Теперь из ответа я могу успешно прочитать поток байтов, например:

byte[] messageImprintDigest1 = response.getTimeStampToken().getTimeStampInfo().getMessageImprintDigest();

for( byte b : messageImprintDigest1) System.out.print(b);

Будет выводить: -3857-93-189410775135085-65-17-1079624-112-81-4079

Во всяком случае, я слепо пробовал все найденное мной предложение, которое переводило бы обратно на "Trolololoooo", но безуспешно. Некоторые (не ограничиваясь) вещи, которые я пробовал:

    String s1 = DigestUtils.sha1Hex(messageImprintDigest1);
    String s2 = new String(Hex.decodeHex(s1.toCharArray()), "UTF-8");
    // how could that help me..? but nothing to lose here.
    String s3 = Hex.encodeHexString(messageImprintDigest1);

    String convert = convert(s1);
//    String convert1 = convert(s2);
//    String convert2 = convert(s3);

    int len = s1.length();
    byte[] cStr = new byte[len/2];
    for(int i = 0; i < len; i+=2) {
        cStr[i/2] = (byte)Integer.parseInt(s1.substring(i, i+2), 16);
    }
    CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
    decoder.onMalformedInput(CodingErrorAction.IGNORE);
    ByteBuffer wrap = ByteBuffer.wrap(cStr);
    CharBuffer decode = decoder.decode(wrap);

    CharBuffer cb = decoder.decode( ByteBuffer.wrap( cStr ));
    String s4 = cb.toString();

...

public static String convert(String hex){
    ByteBuffer buff = ByteBuffer.allocate(hex.length()/2);
    for (int i = 0; i < hex.length(); i+=2) {
        buff.put((byte)Integer.parseInt(hex.substring(i, i+2), 16));
    }
    buff.rewind();
    Charset cs = Charset.forName("UTF-8");
    CharBuffer cb = cs.decode(buff);
    return  cb.toString();
}

Во всяком случае, это, вероятно, некоторые очевидные вещи, которые я пропускаю, например, что messageImprintDigest1 совсем не похож на шестнадцатеричную строку (извините, я изучал геологию в университете).. Все это очень ново для меня, так что трудно спорить с компилятором или чем-то еще там.

2 ответа

Решение

Вы не можете получить исходный текст из дайджеста сообщения. Это односторонний процесс.

Вы пробовали это простое решение?

byte[] b = "Trolololoooo".getBytes();
String s = new String(b);       
System.out.println(s);

будет выводить тролололоооо.

Другие вопросы по тегам