Как сделать «MessageDigest SHA-256 и подпись RSASSA-PSS» эквивалентным «подписи SHA256 с RSA / PSS» - PullRequest
1 голос
/ 17 апреля 2020

Я хочу сделать SHA256 с подписью RSA / PSS в 2 этапа , сначала я получу sh сообщение, а затем подпишу дайджест с помощью RSASSA-PSS

    byte[] document =   {0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1};
    MessageDigest digestor256 = MessageDigest.getInstance("SHA256", "BC");
    byte[] documentDigest256 = digestor256.digest(document);

    DigestAlgorithmIdentifierFinder hashAlgorithmFinder = new faultDigestAlgorithmIdentifierFinder();
    AlgorithmIdentifier hashingAlgorithmIdentifier256 = hashAlgorithmFinder.find("SHA256");

    DigestInfo digestInfo2 = new DigestInfo(hashingAlgorithmIdentifier256, documentDigest256);
    Signature s2 = Signature.getInstance("NONEwithRSASSA-PSS", "BC");
    MGF1ParameterSpec mgfParam = new MGF1ParameterSpec("SHA256");
    PSSParameterSpec pssParam = new PSSParameterSpec("SHA256", "MGF1", mgfParam, 32, 1);
    s.setParameter(pssParam);
    s.initSign(keyPair.getPrivate());
    s.update(digestInfo2.getEncoded());
    byte[] signature = s.sign();

Но я использую SHA256 с RSA / PSS не могу подтвердите

    Signature ver = Signature.getInstance("SHA256withRSA/PSS", "BC");
    ver.setParameter(pssParam);
    ver.initVerify(keyPair.getPublic());
    ver.update(document);
    boolean re = ver.verify(signature);

Мне нужна помощь, чтобы сделать это, спасибо за вашу помощь.

1 Ответ

1 голос
/ 17 апреля 2020

Не делайте DigestInfo. RSASSA-PKCS1v1_5 подписи используют этап кодирования ha sh в ASN.1 DER DigestInfo, но подписи RSASSA-PSS нет; см. RF C 3447 или 8017. Также вам не нужно указывать параметры версии, используя комбинированный алгоритм, потому что значения по умолчанию уже верны, хотя это не мешает делать это излишне. Пример изменен для использования моей пары ключей и вывода на консоль:

    KeyStore ks = KeyStore.getInstance("jks"); ks.load(new FileInputStream(args[0]), args[1].toCharArray());
    PrivateKey prv = (PrivateKey)ks.getKey(args[2], args[1].toCharArray()); 
    PublicKey pub = ks.getCertificate(args[2]).getPublicKey();

    byte[] document =   {0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1};
    MessageDigest digestor256 = MessageDigest.getInstance("SHA256", "BC");
    byte[] documentDigest256 = digestor256.digest(document);

    Signature s2 = Signature.getInstance("NONEwithRSASSA-PSS", "BC");
    MGF1ParameterSpec mgfParam = new MGF1ParameterSpec("SHA256");
    PSSParameterSpec pssParam = new PSSParameterSpec("SHA256", "MGF1", mgfParam, 32, 1);
    s2.setParameter(pssParam);
    s2.initSign(prv);
    s2.update(documentDigest256);
    byte[] signature = s2.sign();

    Signature ver = Signature.getInstance("SHA256withRSA/PSS", "BC");
    if(false){ ver.setParameter(pssParam); } // can enable if desired
    ver.initVerify(pub);
    ver.update(document);
    System.out.println( ver.verify(signature) );

Также, как правило, вы ошиблись DefaultDigestAlgorithmIdentifierFinder и использовали s2 против s для имени переменной.

...