Golang:将字节数组转换为big.Int

时间:2014-07-15 12:06:16

标签: go rsa

我尝试从存储在字节数组中的模数和指数创建RSA公钥。经过一些实验,我得到了以下结论:

func bytes_to_int(b []byte) (acc uint64) {
  length := len(b)
  if length % 4 != 0 {
    extra := (4 - length % 4)
    b = append([]byte(strings.Repeat("\000", extra)), b...)
    length += extra
  }
  var block uint32
  for i := 0; i < length; i += 4 {
    block = binary.BigEndian.Uint32(b[i:i+4])
    acc = (acc << 32) + uint64(block)
  }
return
}

func main() {
  fmt.Println(bytes_to_int(data[:128]))
  fmt.Println(bytes_to_int(data[128:]))
}

这似乎有效(尽管我并不相信没有更好的方法)。我的下一步是将其转换为使用math / big来处理更大的数字。我可以看到一个Lsh函数来执行&lt;&lt;但无法弄清楚如何以递归方式将Uint32(块)添加到big.Int。

作为参考,尝试导入的公钥I是存储在密钥环(pubring.mix)中的Mixmaster密钥: http://www.mixmin.net/draft-sassaman-mixmaster-XX.html#key-format http://pinger.mixmin.net/pubring.mix

3 个答案:

答案 0 :(得分:8)

您希望Int.SetBytesbig.int切片中制作[]byte

func (z *Int) SetBytes(buf []byte) *Int

SetBytesbuf解释为big-endian无符号整数的字节,将z设置为该值,然后返回z

这应该在您的应用程序中使用非常简单,因为根据您链接的文档,您的密钥是大端格式。

答案 1 :(得分:4)

import "math/big"

z := new(big.Int)
z.SetBytes(byteSliceHere)

答案 2 :(得分:1)

就像Nick提到的那样,你可以使用SetBytes,请记住输入是在base64中,所以你必须先解码。

Example

func Base64ToInt(s string) (*big.Int, error) {
    data, err := base64.StdEncoding.DecodeString(s)
    if err != nil {
        return nil, err
    }
    i := new(big.Int)
    i.SetBytes(data)
    return i, nil
}