V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
usufu
V2EX  ›  问与答

golang 中签名问题求助

  •  
  •   usufu · 2019-05-17 15:15:27 +08:00 · 1787 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求助各位大神,java 当中的

    
    RSAPrivateCrtKeySpec rsaPriKey = new RSAPrivateCrtKeySpec(modulus, publicExponent, privateExponent, primeP, primeQ, primeExponentP, primeExponentQ, crtCoefficient);
    KeyFactory keyf = KeyFactory.getInstance("RSA");
    PrivateKey key = keyf.generatePrivate(rsaPriKey);
    
    String input = "测试";
    Signature signature = Signature.getInstance("SHA1withRSA");
    signature.initSign(key);
    signature.update(input.getBytes("utf-8"));
    
    

    用 go 怎么实现,有没有相应的包?尤其是第一部分根据一堆参数生成 rsa key 的部分没有找到 go 怎么写。

    4 条回复    2019-05-20 15:10:59 +08:00
    neighbads
        1
    neighbads  
       2019-05-17 15:39:44 +08:00
    usufu
        2
    usufu  
    OP
       2019-05-17 16:27:19 +08:00
    没找到该用那个方法
    qwerthhusn
        3
    qwerthhusn  
       2019-05-17 17:34:31 +08:00
    其实 RSA 私钥就两个字段 PrivateExponent 和 modules,只要有个这两个其他的就能算出来
    usufu
        4
    usufu  
    OP
       2019-05-20 15:10:59 +08:00
    研究了一下,解决了。记录如下:
    ```
    pubkey := rsa.PublicKey{
    N:Modulus,
    E:int(Exponent.Int64()),
    }

    preValues := rsa.PrecomputedValues{
    Dp:DP,
    Dq:DQ,
    Qinv:InverseQ,
    }

    priKey := rsa.PrivateKey{
    PublicKey: pubkey,
    D:D,
    Primes: []*big.Int{P, Q},
    Precomputed:preValues,
    }
    derBytes := x509.MarshalPKCS1PrivateKey(&priKey)
    PrivateKey, _ := x509.ParsePKCS1PrivateKey(derBytes)

    rand := rand.Reader
    msg := []byte("the message to be signed...")
    hashed := sha1.Sum(msg)
    signbyte, err := rsa.SignPKCS1v15(rand, PrivateKey, crypto.SHA1, hashed[:])
    if err != nil {
    log.Fatal(err)
    }
    signature := base64.StdEncoding.EncodeToString(signbyte)
    fmt.Println(signature)
    expresult := `NDarItrQEHlpT6jAOmz/OgL/nahM1tesCQyN3NcYU8b+O0QPElP3hIQJlYklZnxJaoUZON+8Ja5R+b3lODcsXesRm81bypYCzF5sjPu8P2jvS4A4RE2T3+Pn+JRgUhu5ilxZcrCVYDt1buKcN5uC+VEb+ixSgvWQHY835UCGqow=`
    if strings.Compare(signature, expresult) == 0 {
    fmt.Println("signature correct...")
    } else {
    fmt.Println("Signature NOT correct...")
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:30 · PVG 01:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.