我有一个与此类似的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)?
答案 0 :(得分:1)
我可以使用带有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 signer
中得到了提示