2016-08-18 21 views
2

私には2つのオブジェクトがあります。 key1は、タイプ*rsa.PublicKeyです。 key2は、*ssh.rsaPublicKeyオブジェクトを隠すインタフェースであるタイプ*ssh.PublicKeyです。 ssh.rsaPublicKeyは、次のように定義されます。プライベートインターフェイスとの比較

type ssh.rsaPublicKey rsa.PublicKey 

さらにいくつかの方法があります。そのクラスは、「エクスポートされません」されているのでしかし、私はssh.rsaPublicKeyへのキーのいずれかをキャストすることはできませんそれはssh.PublicKeyを実装していない、と私はkey2からNまたはeにアクセスすることができないので、私はrsa.PublicKeykey2をキャストすることはできません私はrsaPublicKeyオブジェクトを持っていることを知っていないはずですから。

key1key2が同じキーであることをどのように比較する必要がありますか?

+0

staterについては、あなたの平等の定義は何ですか?データを取得したり変換したりするにはいくつかの方法があると思います。 – evanmcdonnal

+0

私の等価性の定義は "同じモジュラス、同じ" N "です。 –

答えて

2

前述のとおり、type assertionは、非公開タイプssh.rsaPublicKeyを参照できないため使用できません。

reflectパッケージを使用して、必要なものが可能です。 rsa.PublicKeyので

ssh.rsaPublicKeyの基本型である、key2に包ま指摘値がrsa.PublicKeyに変換することができます。 key2reflect.Valueを取得したらの値を指し示すように「ナビゲート」し、Value.Elem()を使用します。この値は、タイプrsa.PublicKeyの値に変換可能です。 Value.Convert()を「動的に」使用し、実行時にrsa.PublicKeyに変換することができます。いったんそれを持っていれば、reflect.DeepEquals()を使って比較したり、手動で比較したりすることができます。あなたはInt.Cmp()メソッドを使用する必要がポインタを比較するメモリアドレスを比較するために - タイプ*big.Intである-which PublicKey.Nフィールドを比較し、手動で比較すると、その

key1 := &rsa.PublicKey{N: big.NewInt(123), E: 10} 
key2, _ := ssh.NewPublicKey(&rsa.PublicKey{N: big.NewInt(123), E: 10}) 


key2conv := reflect.ValueOf(key2).Elem(). 
    Convert(reflect.TypeOf(rsa.PublicKey{})).Interface() 
// key2conf is an interface{}, wrapping an rsa.PublicKey 

// Comparision with DeepEqual 
fmt.Println(reflect.DeepEqual(*key1, key2conv)) 

// Comparing manually: 
key22 := key2conv.(rsa.PublicKey) 
fmt.Println(key1.N.Cmp(key22.N)) // Int.Cmp() returns 0 if equal 
fmt.Println(key1.E == key22.E) 

注:

これは、ように見えることができるかであります、尖った値ではありません。 Int.Cmp()は、2つの値が等しい場合は0を返します。

関連する問題