Генерируйте отдельную подпись PKCS7, используя только хэш в Java - PullRequest
0 голосов
/ 08 сентября 2018

Я знаю, что могу создать отдельный PKCS7, используя BouncyCastle, вот так:

String text = "This is a message";

    Security.addProvider(new BouncyCastleProvider());

    KeyStore ks = KeyStore.getInstance(KEYSTORE_INSTANCE);
    ks.load(new FileInputStream(KEYSTORE_FILE), KEYSTORE_PWD.toCharArray());
    Key key = ks.getKey(KEYSTORE_ALIAS, KEYSTORE_PWD.toCharArray());

    //Sign
    PrivateKey privKey = (PrivateKey) key;
    Signature signature = Signature.getInstance("SHA1WithRSA", "BC");
    signature.initSign(privKey);
    signature.update(text.getBytes());

    //Build CMS
    X509Certificate cert = (X509Certificate) ks.getCertificate(KEYSTORE_ALIAS);
    List certList = new ArrayList();
    CMSTypedData msg = new CMSProcessableByteArray(signature.sign());
    certList.add(cert);
    Store certs = new JcaCertStore(certList);
    CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
    ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(privKey);
    gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, cert));
    gen.addCertificates(certs);
    CMSSignedData sigData = gen.generate(msg, false);

    BASE64Encoder encoder = new BASE64Encoder();

    String signedContent = encoder.encode((byte[]) sigData.getSignedContent().getContent());
    System.out.println("Signed content: " + signedContent + "\n");

    String envelopedData = encoder.encode(sigData.getEncoded());
    System.out.println("Enveloped data: " + envelopedData);

Однако мне нужно вычислить хеш вручную, и этот хеш нужно использовать для создания подписи. В приведенном выше коде входные данные представляют собой массив байтов, для которых вычисляется хеш. Мне нужно ввести только хэш (потому что он получен по сети).

...