Проблема актуальная. Не могли бы уважаемые участники выложить исходники своих наработок? У меня есть пример сообщения от участника СМЭВ. Я этот пример скопипастил и пытаюсь Base64 - данные вручную пересчитать. С RSA такой фокус прошел, а с ГОСТом почему-то даже хеш не совпадает. В примере участника, на выходе примера
http://www.cryptopro.ru/...pomoshchyu-kriptopro-jcp и у меня - везде разный хэш. При этом канонизация и алгоритм хэша совпадают. Странно. Ниже привожу кусок кода. GOST_R34.11-94 и CryptoPro2(gostr34102001-gostr3411) из нашего самописного провайдера, мы это давно используем. Подскажите плз, почему хэш не совпадает? И кстати такой вопрос - как вообще этим СМЭВом пользуются? Какой продукт работает из коробки? Похоже что на яве СМЭВ никто не делает почти... Хочу что-нибудь такое поднять, чтобы подписывало-проверяло для проверки своих разработок.
Document doc = XMLUtils.newDocument(new InputSource(new StringReader(sourceXml)));
Canonicalizer canon = Canonicalizer.getInstance("http://www.w3.org/2001/10/xml-exc-c14n#");
byte canonXmlBytes[] = canon.canonicalizeSubtree(XPathAPI.selectSingleNode(doc , "//S:Body"));
log.info("canon body before = "+new String(canonXmlBytes)+";");
MessageDigest dig = MessageDigest.getInstance("GOST_R34.11-94");
byte[] digestBytes = dig.digest(canonXmlBytes);
String digestB64 = Base64.encode(digestBytes);
Element digestElement = (Element)XPathAPI.selectSingleNode(doc , "//ds:DigestValue");
digestElement.setTextContent(digestB64);
log.info("digestB64 = "+digestB64+";");
canonXmlBytes = canon.canonicalizeSubtree(XPathAPI.selectSingleNode(doc , "//*[local-name(.) = 'SignedInfo']"));
log.info("canon signInfo = "+new String(canonXmlBytes)+";");
CryptoProPrivateKey key = new CryptoProPrivateKey("cont25122009_14");
Signature sign = Signature.getInstance("CryptoPro2");
sign.initSign(key);
sign.update(canonXmlBytes);
byte[] signBytes = sign.sign();
String signB64 = Base64.encode(signBytes);
Element signElement = (Element)XPathAPI.selectSingleNode(doc , "//ds:SignatureValue");
signElement.setTextContent(signB64);