-1

我想检查公钥是否对应于私钥 - 是否正确。

也没有称为 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");
        }
    }
}
4

1 回答 1

1

您不能使用DSA进行加密和解密,它是一种数字签名算法。数字签名是通过使用签名者的私钥加密消息的散列来创建的,以便可以使用他们的公钥对其进行验证。但是因为它是散列的,所以消息无法恢复。

在您的编辑之后:

如果您有私钥和公钥,则无论如何都可以从私钥派生公钥,无需使用密钥和验证任何内容。私钥包含构造 a 的所有信息KeyPair,然后该getPublic()方法将检索等效的公钥。如果您想查看给定的公钥是否正确,只需与此进行比较。

于 2012-07-04T16:19:02.507 回答