我有一个PEM编码的DSA公钥。我需要这个DSA密钥,以便我可以验证传入的数据。但是我还没有弄清楚如何使用go crypto库加载密钥(我不是加密专家,但是从我在线阅读,DSA不再是一个受欢迎的选择)。
我可以将PEM解码为其字节。根据我的理解,这是DER编码的ASN.1。如何将PEM块放入golang dsa.PublicKey
?
这是一个可运行的示例:http://play.golang.org/p/8Ma2qwhT31
代码:
package main
import "fmt"
import "encoding/pem"
import "encoding/asn1"
import "crypto/dsa"
var signingPubKey = []byte(`-----BEGIN PUBLIC KEY-----
MIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEApSmU3y4DzPhjnpOrdpPs
cIosWJ4zSV8h02b0abLW6nk7cnb5jSwBZKLrryAlF4vs+cF1mtMYjX0QKtEYq2V6
WVDnoXj3BeLYVbhsHuvxYmwXmAkNsSnhMfSCxsck9y6zuNeH0ovzBD90nISIJw+c
VAnUt0dzc7YKjBqThHRAvi8HoGZlzB7Ryb8ePSW+Mfr4jcH3Mio5T0OH3HTavN6Y
zpnohzQo0blwtwEXZOwrNPjQNrSigdPDrtvM32+hLTIJ75Z2NbIRLBjNlwznu7dQ
Asb/AiPTHXihxCRDm+dH70dps5JfT5Zg9LKsPhANk6fNK3e4wdN89ybQsBaswp9h
xzORVD3UiG4LuqP4LMCadjoEazShEiiveeRBgyiFlIldybuPwSq/gUuFveV5Jnqt
txNG6DnJBlIeYhVlA25XDMjxnJ3w6mi/pZyn9ZR9+hFic7Nm1ra7hRUoigfD/lS3
3AsDoRLy0xZqCWGRUbkhlo9VjDxo5znjv870Td1/+fp9QzSaESPfFAUBFcykDXIU
f1nVeKAkmhkEC9/jGF+VpUsuRV3pjjrLMcuI3+IimfWhWK1C56JJakfT3WB6nwY3
A92g4fyVGaWFKfj83tTNL2rzMkfraExPEP+VGesr8b/QMdBlZRR4WEYG3ObD2v/7
jgOS2Ol4gq8/QdNejP5J4wsCAQM=
-----END PUBLIC KEY-----`)
func main() {
block, _ := pem.Decode(signingPubKey)
if block == nil {
fmt.Errorf("expected block to be non-nil", block)
return
}
var pubkey dsa.PublicKey
_,err := asn1.Unmarshal(block.Bytes, &pubkey)
if (err != nil ){
fmt.Errorf("could not unmarshall data: `%s`", err)
}
fmt.Printf("public key param P: %d\n", pubkey.Parameters.P)
fmt.Printf("public key param Q: %d\n", pubkey.Parameters.Q)
fmt.Printf("public key param G: %d\n", pubkey.Parameters.G)
fmt.Printf("public key Y: %d\n", pubkey.Y)
fmt.Printf("done")
}
对于所有值,哪个输出为nil,所以显然Unmarshal调用并不是我想做的事情(或者管道中早先出现了什么问题)。