https://meganorm.ru/Data2/1/4293788/4293788459.htm хэш (256 бит) функция должна возвращать следующий результат:
строка: 01323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130
хэш: 00557be5e584fd52a449b16Ь0251d05d27f94ab76cbaa6da890b59d8ef1е159d
У нас же другой результат:
строка: 01323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130
хэш: 066a8f6264dce2e37169089b2f685d90bbff911dbc4f4ae36ced9c17d3e820a7
код, который мы используем:
public static void main(String[] args) {
try {
System.out.println("CryptoPro start initialization");
System.setProperty("file.encoding", "UTF-8");
Security.addProvider(new JCSP()); // провайдер JCSP
Security.addProvider(new RevCheck());// провайдер проверки сертификатов JCPRevCheck
//(revocation-провайдер)
Security.addProvider(new CryptoProvider());// провайдер шифрования JCryptoP
System.out.println("CryptoPro initialized");
} catch (Exception e) {
System.err.println("Exception in initializing crypto pro : "+ e);
} catch (Error er) {
System.err.println("Error in initializing crypto pro : "+ er);
}
HashMessageDigester digester = new HashMessageDigester();
String hexString = "01323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130";
try (InputStream input = new ByteArrayInputStream(hexString.getBytes())) {
IOUtils.copy(input, digester);
}
System.out.printf(String.format("\nстрока: %s \nхэш: %s\n",hexString, digester.getHashes().getGOST_3411_2012_256()));
}
public class HashMessageDigester extends OutputStream {
private List<MessageDigest> digests = Collections.singletonList(
MessageDigest.getInstance(JCP.GOST_DIGEST_2012_256_NAME)
);
@Override
public void write(int i) throws IOException {
for (MessageDigest digest : digests) {
digest.update((byte) i);
}
}
public JcpHashes getHashes() {
Map<String, String> result = new HashMap<>();
for (MessageDigest digest : digests) {
if (result.put(digest.getAlgorithm(), Hex.encodeHexString(digest.digest())) != null) {
throw new IllegalStateException("Duplicate key");
}
}
return new JcpHashes(
result.get(JCP.GOST_DIGEST_2012_256_NAME)
);
}
}
Зависимости:
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-asn1rt</artifactId>
<version>5.0.40363-A</version>
</dependency>
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-jcp</artifactId>
<version>5.0.40363-A</version>
</dependency>
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-xml</artifactId>
<version>5.0.40363-A</version>
</dependency>
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-jcrypto</artifactId>
<version>5.0.40363-A</version>
</dependency>
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-jcpRevCheck</artifactId>
<version>5.0.40363-A</version>
</dependency>
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-asn1p</artifactId>
<version>5.0.40363-A</version>
</dependency>
<dependency>
<groupId>ru.cryptopro.jcp</groupId>
<artifactId>jcp-jscp</artifactId>
<version>5.0.40363-A</version>
</dependency>
Что мы делаем не так?