将 *crypto.PrivateKey 转换为 *rsa.PrivateKey

Converting *crypto.PrivateKey to *rsa.PrivateKey

我正在开发一种方法,该方法将根据作为参数传递的私钥类型进行签名。为此,我传递了一个 *crypto.PrivateKey 变量作为参数。但是当我想做一个类型断言来使用参数时,问题就来了。

func Sign(text string, privKey *crypto.PrivateKey) string{
if _, ok := (*privKey).(rsa.PrivateKey) //This is ok
if _, ok := (privKey).(*rsa.PrivateKey) //This is not ok 2

我想我可以做第一件事,因为如果我使用“*”,编译器会认为它是一个接口。但是我不知道为什么我不能做第二件事,当它应该是正确的时候。

对了,我需要用到一个*rsa.PrivateKey类型的变量,我可以这样做:

privRsa, _ := (*privKey).(rsa.PrivateKey)
var priv *rsa.PrivateKey
priv = &privRsa

我不明白的是,为什么我不能直接将 *crypto.PrivateKey 转换为 *rsa.PrivateKey,或者是否存在这样的方法。我按照我现在做的方式做这件事会在内存中分配新的space,如果我想让它高效

,我不应该这样做

crypto.PrivateKey是一个接口。 *crypto.PrivateKey 是指向接口的指针。您可以在接口上使用 type-assertion 来获取基础值:

func Sign(text string, privKey crypto.PrivateKey) string{
   if _, ok := privKey.(rsa.PrivateKey) 
...
}

...
var pkey rsa.PrivateKey
Sign(text,pkey)

这里,接口中的私钥值是rsa.PrivateKey.

的副本

如果你传递pkey的地址,那么接口就会有一个指向私钥的指针:

func Sign(text string, privKey crypto.PrivateKey) string{
   if _, ok := privKey.(*rsa.PrivateKey) 
...
}

...
var pkey rsa.PrivateKey
Sign(text,&pkey)