Есть много людей здесь, на 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 не выглядеть как (прошу прощения, я изучал геологию в университете). Этот материал для меня очень новичок, поэтому трудно спорить с компилятором или каким-то другим материалом.
Просто, чтобы быть уверенным: _The messageImprint ДОЛЖЕН иметь то же значение, что и в аналогичном поле TimeStampReq, при условии, что размер хэш-значение соответствует ожидаемый размер хэш-алгоритма, идентифицированного в hashAlgorithm._ [Ref] (HTTPS : //www.ietf.org/rfc/rfc3161.txt) (стр. 8) означает просто сравнение хэшей? –
Я предлагаю вам решить, о чем этот вопрос. У него уже было одно неправильное название. Если вы спросите, как реализовать RFC 3161, вы должны были сказать это заранее. – EJP
Мне не нужно реализовывать, но мне нужно протестировать реализацию в ближайшем будущем, и поскольку все эти вещи для CA и PKI и т. Д. Для меня очень новы, я немного поиграл с ним. В любом случае, если невозможно преобразовать messagedigest назад, тогда это отвечает на этот конкретный вопрос. –