Java-эквивалент вызова функции C ++ Botan - PullRequest
0 голосов
/ 09 июля 2019

У меня есть код C ++, похожий на этот:

Botan::AutoSeeded_RNG botan_rng;
Botan::RSA_PrivateKey private_key(botan_rng, 2048);
Botan::PK_Signer botan_pss_signer(private_key, botan_rng, "PSSR_Raw(SHA-256,MGF1,32)");

То, что я хотел бы сделать, это реализовать ту же функциональность в Java. Что я пробовал до сих пор, так это:

    Signature rsa = null;
    try {
        rsa = Signature.getInstance("SHA256withRSAAndMGF1", "BC");
    } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
        e.printStackTrace();
    } 

    try {
        rsa.initSign((PrivateKey)privateKey, new SecureRandom());
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    }

И privateKey генерируется как

KeyPairGenerator kpg = null;
try {
    kpg = KeyPairGenerator.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
Key publicKey = kp.getPublic();
Key privateKey = kp.getPrivate();

Вопрос в том, правильно ли я поступаю? Или в моем Java-коде чего-то не хватает? Особенно в отношении той части генератора случайных чисел, я не уверен, что Java SecureRandom делает то же самое, что и в Botan::AutoSeeded_RNG, а также алгоритм, который я использую в BC, не уверен, что это эквивалент для PSSR_Raw (SHA-256, MGF1,32)

1 Ответ

0 голосов
/ 24 июля 2019

Мне удалось решить проблему, используя следующий алгоритм с BC и задав параметры параметров следующим образом:

Signature signature = Signature.getInstance("RawRSASSA-PSS", "BC");
PSSParameterSpec pssParameterSpec = new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, KEY_AUTHORIZATION_INIT_SIGN_SALT_SIZE, 
            PSSParameterSpec.DEFAULT.getTrailerField());
signature.setParameter(pssParameterSpec);

Ключевым моментом было использование алгоритма RAW для подписи хеша. Я получил подсказку из этого поста RAW подписавшего

...