dongshan8953 2016-02-21 17:04
浏览 233
已采纳

如何在Go中获取SHA1 RSA字节签名?

I'm new in Go and having hard time to figure it out how crypto package works.

Basicly I need to sign a string with pem key and get sha1 of that like the equivalent code in C# in below.

Thanks

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.FromXmlString(“<RSAKeyValue><Modulus>oQRshGhLf2Fh...”);
byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes(data), new SHA1CryptoServiceProvider());
  • 写回答

1条回答 默认 最新

  • doushan5245 2016-02-21 18:26
    关注

    C# code

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace RSASHA1
    {
        class Program
        {
            static void Main(string[] args)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString("<RSAKeyValue><Modulus>n9t+R7Zmn4VLaWmixLnUkxfQmwDHqRmtlC3mR0YJ9ntUpqLPIkbZgGbuCM8jzmt3kTs4UIufzxQfim1v8avBYDkijxKRN4/g2juS9IqmWjvdV4CrxfTVGXudiuzeqI3wzoaHY4BmMdhmOA46GV6pifAVeQnJb6Hp6/F9bwi1kFE=</Modulus><Exponent>AQAB</Exponent><P>+ow3plgxHR5BcBApdHu93bLQJHD+DbcUV6qKSHMfQNosjDb6IiPUd6kfHI34DIldot6ooI+AUqZYIqW57J7llw==</P><Q>o1YL/4UkELk5nmU30NA7gLmnZm+bynt9rR2yjkU55SP60tqO5/72aXak/RrSih1BC6WfJxEr2OLMWud6t8wGVw==</Q><DP>U8vXxPPUIVgALNnK86F7RA3NHZMI9U9ZJ2TrcQXH2yndIlw01nxDUG4o8KTu5EqBHbr4jRLRqVLnQVdKUsBmKw==</DP><DQ>XeJJxzeaQVqWOetoJ8hpS1ZrWD/yxnIxDN6zEX/NBV6m/6fM2KD+tiQSNcHDHswt5Snvzx7ZmzLRz7aaHSdSxQ==</DQ><InverseQ>j/DPSjRS09ephgGgiSBFcpxDc+54n6Fo2M2zLhMj/lBoO8klbNPB4YlwFHJjEh9EpbLB1Zwi7XjL2weFX2Ws+g==</InverseQ><D>HRtdMfePVgpyQb5fSczAXQwgCqkosaygQ3PcEyw4ki3AqxrH9mjKH6weOXJmBabhvYr35QqXTaBPYegtUubALda87T7cviK1rCPN18vv+eU4MT9TADQyj9HeYvp7fUfjEfaIaf/QpAXwSRrF/n9CsM1ef4aZX4XFd2uv2SH7yVU=</D></RSAKeyValue>");
                byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes("hello"), new SHA1CryptoServiceProvider());
                StringBuilder hex = new StringBuilder(signMain.Length * 2);
                foreach (byte b in signMain) hex.AppendFormat("{0:x2}", b);
                Console.Write(hex.ToString());
                Console.ReadLine();
            }
        }
    }
    

    Go code for keys generated in OpenSSL < 1.0 and OpenSSL >= 1.0

    package main
    
    import (
        "encoding/pem"
        "fmt"
        "crypto/sha1"
        "crypto/rsa"
        "crypto/rand"
        "crypto/x509"
        "crypto"
        "encoding/hex"
    )
    
    var openssl_10_key string = `-----BEGIN PRIVATE KEY-----
    MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMipwvuAvELnymqg2cdNTX+Df341aT6iZC/5qSv+U2a6tr/sqoIRd4Hi5TQFB0yPcbqL5NhIz8CjrA7k7WROH6F10OKfhPgyxBxRARLSqfVdflFb9WF3BlJeOgHti8j24a38gUsqx42nkbLJM6tmlYqSOSZWR3jPx7ZuqgSNO+G5AgMBAAECgYAGXKN+HjTzZhS1ae4dphmSTmGVzcaAohAzf5XZrp5UTN0lNP3e69DYwSnR8WR4cx/NWBWxHPXa1+Jiz01B3dw3NgdcK9YhheDJEzBjMV8kizqTV2GrwGrc04JI/77uBZdj8bUx3pIhwWOK6ShmhveuPE8Q3EfeZ5g+yKvkF4YTNQJBAPhyENG0qp36VWLyHC4tY7j35tTjYuhTNDsmPI/BNYaSIGzGGfKZweAouUsetk3BQe4fgDHdU+wT+uvArvUPua8CQQDOw8A8K44qUuNLnUUhbTpK0MNXNxA25oOwHHTCqFQLxarZGKj7KqBYiT4bR9TesvfXz2IpvvMOf4UWs57aBL0XAkEArTEnFGkzf0lheMZ6ap5tpCX8nm+dJYPLJ2iyUyxHGfaH8AvxTrNs+cypzvor7+xG/66p+RjnRe1vwCTkUiWSNQJBAMqNhaLsYEciED0hAnoukO59+P9Vl/LQe61pExEm6b7mk+o9eD0lkxNoz4jWI7lOxfGK3fVbdKx9TBnjOPkHr10CQBW22VQhzg75LsrqNeiVGMDXRtlPueSICfxYxXCiDVc0SLi9RpCGo8fsiB+Uk9ENnLk6/vW1/H9IqtS7rQbNy64=
    -----END PRIVATE KEY-----`
    
    var openssl_09_key string = `-----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQDIqcL7gLxC58pqoNnHTU1/g39+NWk+omQv+akr/lNmura/7KqCEXeB4uU0BQdMj3G6i+TYSM/Ao6wO5O1kTh+hddDin4T4MsQcUQES0qn1XX5RW/VhdwZSXjoB7YvI9uGt/IFLKseNp5GyyTOrZpWKkjkmVkd4z8e2bqoEjTvhuQIDAQABAoGABlyjfh4082YUtWnuHaYZkk5hlc3GgKIQM3+V2a6eVEzdJTT93uvQ2MEp0fFkeHMfzVgVsRz12tfiYs9NQd3cNzYHXCvWIYXgyRMwYzFfJIs6k1dhq8Bq3NOCSP++7gWXY/G1Md6SIcFjiukoZob3rjxPENxH3meYPsir5BeGEzUCQQD4chDRtKqd+lVi8hwuLWO49+bU42LoUzQ7JjyPwTWGkiBsxhnymcHgKLlLHrZNwUHuH4Ax3VPsE/rrwK71D7mvAkEAzsPAPCuOKlLjS51FIW06StDDVzcQNuaDsBx0wqhUC8Wq2Rio+yqgWIk+G0fU3rL3189iKb7zDn+FFrOe2gS9FwJBAK0xJxRpM39JYXjGemqebaQl/J5vnSWDyydoslMsRxn2h/AL8U6zbPnMqc76K+/sRv+uqfkY50Xtb8Ak5FIlkjUCQQDKjYWi7GBHIhA9IQJ6LpDuffj/VZfy0HutaRMRJum+5pPqPXg9JZMTaM+I1iO5TsXxit31W3SsfUwZ4zj5B69dAkAVttlUIc4O+S7K6jXolRjA10bZT7nkiAn8WMVwog1XNEi4vUaQhqPH7IgflJPRDZy5Ov71tfx/SKrUu60Gzcuu
    -----END RSA PRIVATE KEY-----`
    
    func main() {
        h := sha1.New()
        h.Write([]byte("hello"))
        sum := h.Sum(nil)
    
        // For RSA keys generated with OpenSSL < 1.0
        pem09, _ := pem.Decode([]byte(openssl_09_key))
        privateKey09, _ := x509.ParsePKCS1PrivateKey(pem09.Bytes)
        sig, _ := rsa.SignPKCS1v15(rand.Reader, privateKey09, crypto.SHA1, sum)
        fmt.Println("OpenSSL < 1.0", hex.EncodeToString(sig))
    
        // For RSA keys generated with OpenSSL >= 1.0
        pem10, _ := pem.Decode([]byte(openssl_10_key))
        privateKey10I, _ := x509.ParsePKCS8PrivateKey(pem10.Bytes)
        privateKey10 := privateKey10I.(*rsa.PrivateKey)
        sig, _ = rsa.SignPKCS1v15(rand.Reader, privateKey10, crypto.SHA1, sum)
        fmt.Println("OpenSSL >= 1.0", hex.EncodeToString(sig))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播