2014-03-13 1 views
-1

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

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 не выглядеть как (прошу прощения, я изучал геологию в университете). Этот материал для меня очень новичок, поэтому трудно спорить с компилятором или каким-то другим материалом.

ответ

3

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

+0

Просто, чтобы быть уверенным: _The messageImprint ДОЛЖЕН иметь то же значение, что и в аналогичном поле TimeStampReq, при условии, что размер хэш-значение соответствует ожидаемый размер хэш-алгоритма, идентифицированного в hashAlgorithm._ [Ref] (HTTPS : //www.ietf.org/rfc/rfc3161.txt) (стр. 8) означает просто сравнение хэшей? –

+0

Я предлагаю вам решить, о чем этот вопрос. У него уже было одно неправильное название. Если вы спросите, как реализовать RFC 3161, вы должны были сказать это заранее. – EJP

+0

Мне не нужно реализовывать, но мне нужно протестировать реализацию в ближайшем будущем, и поскольку все эти вещи для CA и PKI и т. Д. Для меня очень новы, я немного поиграл с ним. В любом случае, если невозможно преобразовать messagedigest назад, тогда это отвечает на этот конкретный вопрос. –

-1

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

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

будет выводить Trolololoooo.

+0

Это простое решение, но не на этот вопрос. Кажется, вы даже не читали его. – EJP