猿问

去分布式数据库和爪哇每日生活安全管理局之间的区别

  1. Go 使用 DSA 私钥生成签名

  2. Java 使用 DSA 公钥验证第一步结果

  3. Java 应该返回真值,但返回假值

package main

import (

    "crypto/dsa"

    "crypto/rand"

    "encoding/asn1"

    "encoding/hex"

    "fmt"

    "golang.org/x/crypto/ssh"

    "math/big"

)


func main() {

    // a dsa private key

    pemData := []byte("-----BEGIN DSA PRIVATE KEY-----\n" +

        "MIIBvAIBAAKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR\n" +

        "+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb\n" +

        "+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdg\n" +

        "UI8VIwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlX\n" +

        "TAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCj\n" +

        "rh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQB\n" +

        "TDv+z0kqAoGBAIb9o0KPsjAdzjK571e1Mx7ZhEyJGrcxHiN2sW8IztEbqrKKiMxp\n" +

        "NlTwm234uBdtzVHE3uDWZpfHPMIRmwBjCYDFRowWWVRdhdFXZlpCyp1gMWqJ11dh\n" +

        "3FI3+O43DevRSyyuLRVCNQ1J3iVgwY5ndRpZU7n6y8DPH4/4EBT7KvnVAhR4Vwun\n" +

        "Fhu/+4AGaVeMEa814I3dqg==\n" +

        "-----END DSA PRIVATE KEY-----")

    // parse dsa 

    p, _ := ssh.ParseRawPrivateKey(pemData)

    pp := p.(*dsa.PrivateKey)


    // orign data

    hashed := []byte{1}

    r, s, _ := dsa.Sign(rand.Reader, pp, hashed)


    type dsaSignature struct {

        R, S *big.Int

    }

    var ss dsaSignature

    ss.S = s

    ss.R = r

    signatureBytes, _ := asn1.Marshal(ss)


    // print sign 

    fmt.Println(hex.EncodeToString(signatureBytes))

}

  1. Java 读取 DSA 公钥并初始化签名者

  2. Java 验证第一步符号结果

  3. 返回假



德玛西亚99
浏览 97回答 1
1回答

阿波罗的战车

在 Java 中,(签名)算法名称是 的别名,即原始 FIPS186-0 算法。这与显然由Go实现的非标准“原始”原语不同。 确实是您想要的正确Java名称,但是“标准”(SUN)提供程序中的实现是一种笨拙的东西,需要20个字节的数据,而不是或多或少,因为这是SHA1哈希的大小,这是FIPS186-3之前DSA的唯一标准哈希。DSASHA1withDSANONEwithDSA如果您(拥有或可以获取并)使用 BouncyCastle 提供程序,则它没有此限制,并且应该适用于更改为的代码(并且修改了代码或安全配置,以便选择 BC 作为提供程序,当然)。NONEwithDSA如果你不使用Buly,我认为你必须自己编写算法代码;我不认为有任何方法可以让SUN实现做你想做的事情。尽管最好对标准中指定的适当大小的哈希值进行签名,而不是原始数据,然后可以使用指定和设计的 Java 提供程序。
随时随地看视频慕课网APP

相关分类

Go
我要回答