如何在 Java 中发送和接收 DSA public/private 签名消息

How to send and receive a DSA public/private signed message in Java

我找不到任何关于如何在 Java 中交换 public/private 密钥签名消息的好(完整)文档。

我还没有找到关于使用 DSA 生成 public 密钥和私钥所需的最少步骤的简明文档,签署一个字节 [],并验证它。

来自 Oracle 的 documentation 过于分散,需要 运行 跨多个 JVM。

我已经用私钥成功地签署了一个字节数组,并用 public 密钥验证了它。

示例。

    byte[] data = "hello.".getBytes();

    /* Test generating and verifying a DSA signature */
    try {
        /* generate a key pair */
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
        keyGen.initialize(1024, new SecureRandom());
        KeyPair pair = keyGen.generateKeyPair();

        /* create a Signature object to use
         * for signing and verifying */
        Signature dsa = Signature.getInstance("SHA/DSA"); 

        /* initialize the Signature object for signing */
        PrivateKey priv = pair.getPrivate();
        dsa.initSign(priv);

        /* Update and sign the data */
        dsa.update(data);

        /* Now that all the data to be signed
         * has been read in, sign it */
        byte[] sig = dsa.sign();

        /* Verify the signature */

        /* Initialize the Signature object for verification */
        PublicKey pub = pair.getPublic();
        dsa.initVerify(pub);

        /* Update and verify the data */
        dsa.update(data);

        boolean verifies = dsa.verify(sig);
        Assert.assertTrue(verifies);
    } catch (Exception e) {
        System.err.println("Caught exception " + e.toString());
    }

在这个版本中,我将 public 密钥序列化为一个字节数组,然后从该字节数组创建一个 PublicKey。

    byte[] data = "hello.".getBytes();

    /* Test generating and verifying a DSA signature */
    try {
        /* generate a key pair */
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
        keyGen.initialize(1024, new SecureRandom());
        KeyPair pair = keyGen.generateKeyPair();

        /* create a Signature object to use
         * for signing and verifying */
        Signature dsa = Signature.getInstance("SHA/DSA"); 

        /* initialize the Signature object for signing */
        PrivateKey priv = pair.getPrivate();
        dsa.initSign(priv);

        /* Update and sign the data */
        dsa.update(data);

        /* Now that all the data to be signed
         * has been read in, sign it */
        byte[] sig = dsa.sign();

        /* Verify the signature */

        /* Initialize the Signature object for verification */
        PublicKey pub = pair.getPublic();
        /* Encode the public key into a byte array */
        byte[] encoded = pub.getEncoded();
        /* Get the public key from the encoded byte array */
        PublicKey fromEncoded = KeyFactory.getInstance("DSA", "SUN").generatePublic(new X509EncodedKeySpec(encoded));
        dsa.initVerify(fromEncoded);

        /* Update and verify the data */
        dsa.update(data);

        boolean verifies = dsa.verify(sig);
        Assert.assertTrue(verifies);
    } catch (Exception e) {
        System.err.println("Caught exception " + e.toString());
    }