2012-01-01 128 views
1

我想创建一个Google Go应用程序,它能够对DER编码和解码大整数(即ECDSA signature r and s)。根据我的理解,我应该使用asn1 package,但是我应该调用哪些函数?Go,DER和处理大整数

例如,我想编码

316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d 

bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc812 

得到这个:

30450220316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d022100bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc81201 

,反之亦然。我应该调用哪种函数进行编码,以及哪种函数用于解码以及如何进行编码

回答

2

您需要编码含有R和S整数的ASN.1序列如下:

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

请注意,我不是根据文档元帅围棋开发人员,但并解组功能似乎接受结构以编码/解码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 2012-01-03 19:18:54

+0

确实,你是对的。我没有注意到这个最后的“01”,但我不认为这是正确的ASN.1 DER编码。编码消息以“0x30 0x45”开始:0x30是通用标签SEQUENCE,0x45是序列长度(不包括标签和长度);如果您读取序列中的69个字节(十进制中的0x45),您将获得除最后的“01”之外的所有数据。 – Jcs 2012-01-03 20:02:20

+0

嗯,也许这是一个字节特定于实现,使用编码。已经在这里讨论 - http://bitcoin.stackexchange.com/questions/2376/ecdsa-rs-encoding-as-a-signature – ThePiachu 2012-01-03 20:14:07