2012-01-01 17 views
1

大きな整数(つまり、ECDSA signature r and s)をDERでエンコードしてデコードできるGoogle Goアプリケーションを作成したいと考えています。私が理解しているところでは、asn1 packageを使用するべきですが、どの機能を呼び出すべきですか?例えばGo、DER、大きな整数を扱う

、私はこれを取得する

316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d 

bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc812 

をエンコードしたい:

30450220316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d022100bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc81201 

およびその逆を。エンコーディングのためにどの関数を呼び出す必要がありますか。

ECDSA-Sig-Value ::= SEQUENCE { 
    r INTEGER, 
    s INTEGER } 

私が行くの開発者が、ドキュメントの元帥に応じていないですので注意してくださいと非整列化機能が受け入れるようだ:次のように

答えて

2

あなたはRとSの両方の整数を含むASN.1配列をコードする必要がありますASN.1シーケンスをエンコード/デコードするための構造体。

このサンプルコードは、符号化および復号化の両方のために働くと思われる:

package main 

import (
    "fmt" 
    "big" 
    "asn1" 
) 

type ecdsa struct { 
    R, S *big.Int 
} 

func main() { 
    r, _ := new(big.Int).SetString("316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d", 16); 
    s, _ := new(big.Int).SetString("bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc812", 16); 
    sequence := ecdsa{r, s} 
    encoding, _ := asn1.Marshal(sequence) 
    fmt.Println(encoding) 
    dec := new(ecdsa) 
    asn1.Unmarshal(encoding, dec) 
    fmt.Println(dec) 
} 
+0

うーん、符号化されたメッセージは、末尾に01バイトを欠いているように見えます。 – ThePiachu

+0

本当に、あなたは正しいです。私はこの最終的な "01"に気づきませんでしたが、これは正しいASN.1 DERエンコーディングとは思われません。エンコードされたメッセージは「0x30 0x45」で始まります。0x30はユニバーサルタグSEQUENCEで、0x45はシーケンスの長さです(タグと長さは除外されます)。シーケンス内の69バイト(10進数では0x45)を読み取ると、すべてのデータが得られますが、最後の「01」は取得されます。 – Jcs

+0

ええ、それはエンコーディングが使用されている実装固有のバイトかもしれません。既にここでそれについて議論しています - http://bitcoin.stackexchange.com/questions/2376/ecdsa-rs-encoding-as-a-signature – ThePiachu

関連する問題