我试图让 Java 验证签名的 SHA-1 哈希,但它一直返回 false。我在 Go 中有以下代码,它生成一个 RSA 密钥对并签名并返回任何到达 /sign 端点的消息以及十六进制编码的散列和公钥模数和指数:


package main


import (

    "crypto"

    "crypto/rand"

    "crypto/rsa"

    "encoding/hex"

    "encoding/json"

    "fmt"

    "io"

    "net/http"

    "strconv"

)


var PrivKey *rsa.PrivateKey


type Message struct {

    Message string `json:"message"`

}


func (msg *Message) Decode(r io.Reader) error {

    return json.NewDecoder(r).Decode(&msg)

}


type Signature struct {

    Hash      string `json:"hash"`

    Signature string `json:"signature"`

    N         string `json:"N"`

    E         string `json:"E"`

}


func hash(msg string) []byte {

    sh := crypto.SHA1.New()

    sh.Write([]byte(msg))

    hash := sh.Sum(nil)

    return hash

}


func SignWithKey(msg Message) Signature {

    hash := hash(msg.Message)

    bytes, err := rsa.SignPKCS1v15(rand.Reader, PrivKey, crypto.SHA1, hash)

    if err != nil {

        panic(err)

    }

    signature := hex.EncodeToString(bytes)

    sig := Signature{

        hex.EncodeToString(hash),

        signature,

        PrivKey.PublicKey.N.String(),

        strconv.Itoa(PrivKey.PublicKey.E),

    }

    return sig

}


func sign(w http.ResponseWriter, r *http.Request) {

    fmt.Println("/sign")

    var msg Message

    err := msg.Decode(r.Body)

    if err != nil {

        panic(err)

    }


    fmt.Println("Signing: " + msg.Message)

    signature := SignWithKey(msg)

    js, err := json.Marshal(signature)

    fmt.Println(string(js))


    w.Header().Set("Content-Type", "application/json")

    w.Write(js)

}


func LoadKeys() {

    // generate private key

    var err error

    PrivKey, err = rsa.GenerateKey(rand.Reader, 2048)

    if err != nil {

        fmt.Println(err)

    }

}


func main() {


    fmt.Println("Loading Keys")

    LoadKeys()

    fmt.Println("Keys Loaded")

    http.HandleFunc("/sign", sign)


    http.ListenAndServe(":8080", nil)

}

在 Java/Android 端,我有这个代码,它在发送相关位后使用未解析的 JSON 对象命中这个函数,但是一旦它到达签名验证部分,它总是返回 false