java中的DSA数据转换

java中的DSA数据转换,java,encryption,rsa,dsa,Java,Encryption,Rsa,Dsa,我想检查公钥是否与私钥对应-是否正确 也没有名为BC的提供者。 我有这个实现,但我不知道Utils.createFixedRandom()应该做什么。 我没有这样的库和方法 此外,如果您有一个没有java.security的原始实现,那就太棒了 import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.Si

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

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

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

编辑后:


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

个人X-拥有私钥Perosn Y-拥有公钥M是一条消息,如果我们无法对其进行编码,其目的是为了对消息进行签名,从而保证其完整性。这与保密无关——如果你有秘密信息,你需要一个加密算法。如果它是一个公共文档,但您希望人们相信(a)它来自您,并且(b)没有被篡改,那么您可以在它上附加一个使用私钥生成的数字签名。两种基本的不同类型的算法用于不同的目的。那么,如何将私钥附加到消息中,然后检查此人是否拥有正确的密钥?如何确认?我不确定我是否理解这个问题?你在这里的密码学用例是什么?你想解决什么问题?是发送一条不能在传输过程中阅读的信息吗?如果是,有多少个收件人,发件人与收件人之间有什么关系?所有这些因素都会影响算法的选择。大卫,你不能再修改了。当然,您可以使用私钥生成签名,并使用公钥验证签名,但不保证整个密钥对没有被替换,这也不能完成全部工作(除了创建/编码/解码似乎正常工作)。