我想检查公钥是否与私钥对应 - 是否正确。
也没有名为BC的提供商。 我有这个实现,但我不知道Utils.createFixedRandom()假设做什么。 我没有这样的库和方法。
此外,如果你有一个没有java.security的原始实现,它会很棒。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Signature;
public class BasicDSAExample {
public static void main(String[] args) throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "BC");
keyGen.initialize(512, new SecureRandom());
KeyPair keyPair = keyGen.generateKeyPair();
Signature signature = Signature.getInstance("DSA", "BC");
signature.initSign(keyPair.getPrivate(), Utils.createFixedRandom() );
byte[] message = new byte[] { (byte) 'a', (byte) 'b', (byte) 'c' };
signature.update(message);
byte[] sigBytes = signature.sign();
signature.initVerify(keyPair.getPublic());
signature.update(message);
if (signature.verify(sigBytes)) {
System.out.println("pow");
} else {
System.out.println("nie");
}
}
}
答案 0 :(得分:1)
您无法使用DSA加密和解密,它是一种数字签名算法。通过使用签名者的私钥加密消息的散列来创建数字签名,以便可以使用其公钥来验证它。但由于它是散列的,因此无法恢复消息。
关注您的修改:
如果您有私钥和公钥,则公钥可以从私有密钥派生,无需使用密钥并验证任何内容。私钥包含构造KeyPair
的所有信息,然后getPublic()
方法将检索等效的公钥。如果您想查看给定的公钥是否正确,请与此进行比较。