рдХреНрд░рд┐рдкреНрдЯреЛ рдкреНрд░реЛ рд╕реЗ рдмрдЪред GOST 34.10-2012 рд╕рдВрд╕реНрдХрд░рдг

Habr├й рдкрд░ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд▓реЗрдЦ рд╣реИ " Crypto Pro рд╕реЗ рдмрдЪрдирд╛ред рдирд┐рд░реНрджреЗрд╢рдХ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг, SMEV- рд╕рдВрд╕реНрдХрд░рдг ", рд▓реЗрдХрд┐рди рд╡рд░реНрд╖ 2019 рдЖрдпрд╛ рдФрд░ рд╕рднреА CA рдиреЗ GOST 34.10-2001 рдХреЗ рдмрдЬрд╛рдп GOST 34.10-2012 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬрд╛рд░реА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рдирдП рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рдмрд╛рдЙрдВрд╕реА рдХреИрд╕рд▓ рдкрд░ рдЕрдкрдиреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреАред

рдЫрд╡рд┐

рддреНрдпрд╛рдЧ


рдореБрдЭреЗ рдмрд╛рдЙрдВрд╕реА рдХреИрд╕рд▓ рдФрд░ рдЕрдиреНрдп рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдХрд╛рдиреВрдиреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реВрдВред рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╡рдХреАрд▓ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рдХрд░реЗрдВред

рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдореВрд▓ рд▓реЗрдЦред рдореИрдВ рдЦреБрдж рдХреЛ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ред

рдЯреЛрдХрди рд╕реЗ рдПрдХ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдЫрд╡рд┐

рдореБрдЭреЗ рдЬреНрдЮрд╛рдд рд╕рднреА рд╕реАрдП рд╕рдорд╛рди рдЯреЛрдХрди рдкрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдЪрд╛рдмрд┐рдпрд╛рдБ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдЬреА рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдХрдВрдЯреЗрдирд░ рдЯреЛрдХрди рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред CryptoPro CSP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХреБрдВрдЬреА рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ "CryptoPro pfx" рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред

рдорд╛рдирдХ pfx рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ CA рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреБрдВрдЬреА рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реАрдП рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдЕрдЪреНрдЫреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдореЗрдВ рд╢рд░реНрдо рдирд╣реАрдВ рдЖрддреАред

CryptoPro рдХрдВрдЯреЗрдирд░ рдХреЛ рдорд╛рдирдХ pxx рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо, рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, P12FromGostCSP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреБрд░рд╛рдиреЗ рд╣реИрдХ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг 2012 рдЧреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд▓реЗрдЦрдХреЛрдВ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдЦрд░реАрджрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ pfx рдорд┐рд▓рд╛ред

рдЙрдЫрд╛рд▓рднрд░реА рдХреИрд╕рд▓ рдЕрдкрдбреЗрдЯ

рд╣рдо рдмрд╛рдЙрдВрд╕реА рдХреИрд╕рд▓ рдХреЛ 1.60 рдкреБрд░рд╛рдиреЗ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг GOST 2012 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.60</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.60</version> </dependency> 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрдЫрд╛рд▓рднрд░реА рдорд╣рд▓

  static { BouncyCastleProvider bcProvider = new BouncyCastleProvider(); String name = bcProvider.getName(); Security.removeProvider(name); // remove old instance Security.addProvider(bcProvider); } 

Pfx рдкрд╛рд░реНрд╕рд┐рдВрдЧ

 KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); ByteArrayInputStream baos = new ByteArrayInputStream(pfxFileContent); keyStore.load(baos, password.toCharArray()); Enumeration<String> aliases = keyStore.aliases(); while (aliases.hasMoreElements()) { String alias = aliases.nextElement(); if (keyStore.isKeyEntry(alias )) { Key key = keyStore.getKey(alias , keyPassword.toCharArray()); java.security.cert.Certificate certificate = keyStore.getCertificate(alias ); addKeyAndCertificateToStore((PrivateKey)key, (X509Certificate)certificate); } } 

рдЙрдкрдирд╛рдо рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред P12FromGostCSP рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдЙрдкрдирд╛рдо "csp_exported" рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдФрд░ рджреВрд╕рд░реА рдХреБрдВрдЬреА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреАред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, pfx рд╕реЗ рдХреБрдВрдЬреА рдХреЛ рдорд╛рдирдХ Java KeyStore рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбрд╛рдЙрдирд▓реЛрдб KeyStore

 FileInputStream is = new FileInputStream(keystorePath); keystore = KeyStore.getInstance(KeyStore.getDefaultType()); char[] passwd = keystorePassword.toCharArray(); keystore.load(is, passwd); 

KeyStore рдореЗрдВ рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХреБрдВрдЬреА рд╕рд╣реЗрдЬрдирд╛

 public void addKeyAndCertificateToStore(PrivateKey key, X509Certificate certificate) { synchronized (this) { keystore.setKeyEntry(alias.toLowerCase(), key, keyPassword.toCharArray(), new X509Certificate[] {certificate}); FileOutputStream out = new FileOutputStream(keystorePath); keystore.store(out, keystorePassword.toCharArray()); out.close(); } } 

KeyStore рд╕реЗ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

 Enumeration<String> aliases = keystore.aliases(); while (aliases.hasMoreElements()) { String alias = aliases.nextElement(); if (keystore.isKeyEntry(alias)) { Key key = keystore.getKey(alias, keyPassword.toCharArray()); keys.put(alias.toLowerCase(), key); //any key,value collection Certificate certificate = keystore.getCertificate(alias); if (certificate instanceof X509Certificate) certificates.put(alias.toLowerCase(), (X509Certificate) certificate); //any key,value collection } } 

рдлрд╝рд╛рдЗрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░

 CMSProcessableByteArray msg = new CMSProcessableByteArray(dataToSign); List certList = new ArrayList(); certList.add(cert); Store certs = new JcaCertStore(certList); CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); ContentSigner signer = new org.bouncycastle.operator.jcajce.JcaContentSignerBuilder("GOST3411WITHECGOST3410-2012-256").setProvider("BC").build(privateKey); gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(signer, certificate)); gen.addCertificates(certs); CMSSignedData sigData = gen.generate(msg, false); byte[] sign = sigData.getEncoded(); //result here 

512 рдмрд┐рдЯ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ JCContentSignerBuilder рд╡рд┐рдХрд▓реНрдк ("GOST3411WITHECGOST3410-2012-512") рд╣реИред рдореЗрд░рд╛ рд╕реАрдП рдмрд┐рдирд╛ рдХреБрдЫ рдкреВрдЫреЗ 256 рдмрд┐рдЯреНрд╕ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИред

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди

 byte[] data = ...; //signed file data byte[] signature = ...;//signature boolean checkResult = false; CMSProcessable signedContent = new CMSProcessableByteArray(data); CMSSignedData signedData; try { signedData = new CMSSignedData(signedContent, signature); } catch (CMSException e) { return SIGNATURE_STATUS.ERROR; } SignerInformation signer; try { Store<X509CertificateHolder> certStoreInSing = signedData.getCertificates(); signer = signedData.getSignerInfos().getSigners().iterator().next(); Collection certCollection = certStoreInSing.getMatches(signer.getSID()); Iterator certIt = certCollection.iterator(); X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next(); X509Certificate certificate = new JcaX509CertificateConverter().getCertificate(certHolder); checkResult = signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificate)); } catch (Exception ex) { return SIGNATURE_STATUS.ERROR; } 

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди 2001 рдХреЗ GOST рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рд░рд╛рдВрд╢


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ 2019 рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯреЛ рдкреНрд░реЛ рдХреЗ рднрд╛рд░реА рднрд╛рд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред

Source: https://habr.com/ru/post/hi440882/


All Articles