2012-01-01 4 views
1

Я хочу создать приложение Google Go, которое сможет DER кодировать и декодировать большие целые числа (а именно ECDSA signature r and s). Насколько я понимаю, я должен использовать asn1 package, но какие функции мне следует звонить?Go, DER и обработка больших целых чисел

Например, я хочу, чтобы закодировать

316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d 

и

bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc812 

, чтобы получить это:

30450220316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d022100bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c37ae72234696524b2bc81201 

и наоборот. Какую функцию я должен вызывать для кодирования, и которая для декодирования и как?

ответ

2

Вы должны кодировать последовательность ASN.1, содержащую как г и ые целые числа следующим образом:

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

Пожалуйста, обратите внимание, что я не являюсь разработчиком Go, но в соответствии с документацией маршалом и функции распаковать, кажется, принимает структур для кодирования/декодирования последовательностей 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 байтов (0x45 в десятичной форме) в последовательности, вы получаете все данные, кроме окончательного «01». – Jcs

+0

Хм, может быть, это байт, специфичный для реализации, в котором используется кодировка. Уже обсуждая это здесь - http://bitcoin.stackexchange.com/questions/2376/ecdsa-rs-encoding-as-a-signature – ThePiachu

Смежные вопросы