第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 PEM 文件加載(openssl 生成)DSA 私鑰

從 PEM 文件加載(openssl 生成)DSA 私鑰

Go
拉風的咖菲貓 2021-11-15 20:54:14
我正在嘗試在我的程序中加載一個 dsa 私鑰,這是我的方法:我使用 openssl 創(chuàng)建了一個 dsa 密鑰對:openssl dsaparam -genkey 2048 -out dsakey.pem我使用以下函數(shù)來解析 pem 文件func getDSAPrivateKeyFromPemFile(pemfilepath string) (recoveredprivateKey *dsa.PrivateKey, err error) {pemfile, err := os.Open(pemfilepath)if err != nil {    return nil, err}recoveredbytes, err := ioutil.ReadAll(pemfile)if err != nil {    return nil, err}recoveredpemdsaparameteres, rest := pem.Decode(recoveredbytes)if recoveredpemdsaparameteres == nil {    return nil, errors.New("No pem recovered")}_, err = asn1.Unmarshal(append(recoveredpemdsaparameteres.Bytes, recoveredpemdsaprivatekey.Bytes...), recoveredprivateKey)if err != nil {    return nil, err } fmt.Printf("PEM:%v\n", recoveredpemdsaparameteres) recoveredpemdsaprivatekey, _ := pem.Decode(rest) fmt.Printf("PEM:%v\n", recoveredpemdsaprivatekey) pemfile.Close()}當我調(diào)用這個函數(shù)失敗時:panic: reflect: call of reflect.Value.Type on zero Valuegoroutine 1 [running]:reflect.Value.Type(0x0, 0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/reflect/value.go:1664 +0x7bencoding/asn1.parseField(0x0, 0x0, 0x0, 0xc8200b0600, 0x58b, 0x600, 0x0, 0x0, 0x0, 0x0, ...)    /usr/local/go/src/encoding/asn1/asn1.go:558 +0xbdencoding/asn1.UnmarshalWithParams(0xc8200b0600, 0x58b, 0x600, 0x1383e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)    /usr/local/go/src/encoding/asn1/asn1.go:957 +0x16eencoding/asn1.Unmarshal(0xc8200b0600, 0x58b, 0x600, 0x1383e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/encoding/asn1/asn1.go:950 +0x8fmain.getDSAPrivateKeyFromPemFile(0x1e7fa0, 0x26, 0x0, 0x0, 0x0)但是,我可以在輸出中完美地看到我的 dsa 密鑰:PEM:&{DSA PARAMETERS map[] [48 130 2 45 2 130...]}PEM:&{DSA PRIVATE KEY map[] [48 130 3 86 2 1 0 ...]}問題實際上是如何將 pem 字節(jié)解組到 dsa.PrivateKey。有任何想法嗎?PS:我找不到任何通過 Internet 加載 DSA 私鑰 pem 文件的示例。
查看完整描述

1 回答

?
ITMISS

TA貢獻1871條經(jīng)驗 獲得超8個贊

花了幾個小時后,我設(shè)法解決了我的問題,我發(fā)布了我的發(fā)現(xiàn),這樣可以節(jié)省一些人的時間:


首先,我使用這個很棒的在線工具查看了我的 pem 文件編碼:http : //lapo.it/asn1js/。直到那時我才意識到 go 期望 pem 文件具有不同的結(jié)構(gòu)......不好!之后,將文件中的每個值與相應(yīng)的 dsa.PrivateKey 結(jié)構(gòu)相關(guān)聯(lián)并不難。因此,我創(chuàng)建了一個新結(jié)構(gòu)并將其命名為 MyPrivateKey,其順序與 pem 文件相同:


type MyPrivateKey struct {

    E1, P, Q, G, Y, X *big.Int

}

然后,我沒有嘗試直接解組到 dsa.PrivateKey,而是將 asn1 編碼的值解組到我自制的結(jié)構(gòu)中。它神奇地起作用了。這是修改后的函數(shù):


func getDSAPrivateKeyFromPemFile(pemFilePath string) (privateKey *dsa.PrivateKey, err error) {

    pemfile, err := os.Open(pemFilePath)


    if err != nil {

        return nil, err

    }

    recoveredBytes, err := ioutil.ReadAll(pemfile)

    if err != nil {

        return nil, err

    }

    pemfile.Close()


    pemDSAParameters, rest := pem.Decode(recoveredBytes)

    if pemDSAParameters == nil {

        return nil, errors.New("No pem recovered")

    }

    pemDSAPrivateKey, _ := pem.Decode(rest)

    keyParameters := dsa.Parameters{G: big.NewInt(0), P: big.NewInt(0), Q: big.NewInt(0)}

    _, err = asn1.Unmarshal(pemDSAParameters.Bytes, &keyParameters)

    if err != nil {

        return nil, err

    }

    //fmt.Printf("\n\n\n\n\n\nP:%x\n\nG:%x\n\nQ:%x\n\n\n\n\n\n", keyParameters.P, keyParameters.G, keyParameters.Q)

    myPrivateKey := MyPrivateKey{}

    _, err = asn1.Unmarshal(pemDSAPrivateKey.Bytes, &myPrivateKey)

    if err != nil {

        return nil, err

    }

    //fmt.Printf("\nprivate\nE1:%x\n\nP:%x\n\nQ:%x\n\nG:%x\n\nY:%x\nX:%x\n\n\n\n", myPrivateKey.E1, myPrivateKey.P, myPrivateKey.Q, myPrivateKey.G, myPrivateKey.Y, myPrivateKey.X)

    privateKey = &dsa.PrivateKey{}

    privateKey.Parameters = keyParameters

    privateKey.X = myPrivateKey.X


    return privateKey, nil

}

也許有一個更簡單的方法來完成這一切,而我只是忽略了!如果您知道更好的方法,請成為我的客人!否則,我相信 go 應(yīng)該在標準庫中處理此類問題。


查看完整回答
反對 回復 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 495 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號