1 回答

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)該在標準庫中處理此類問題。
- 1 回答
- 0 關(guān)注
- 495 瀏覽
添加回答
舉報