我正在尝试从存储在字节数组中的模数和指数创建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:]))
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效(虽然我不相信没有更好的方法).我的下一步是将其转换为使用math/big来处理更大的数字.我可以看到一个Lsh函数来执行<<但无法弄清楚如何以递归方式将Uint32(块)添加到big.Int.
作为参考,我试图导入的公钥是存储在密钥环中的Mixmaster密钥(pubring.mix):http: //www.mixmin.net/draft-sassaman-mixmaster-XX.html#key-format http ://pinger.mixmin.net/pubring.mix
你想Int.SetBytes做出big.int从一片[]byte.
func (z *Int) SetBytes(buf []byte) *Int
Run Code Online (Sandbox Code Playgroud)
SetBytes解释buf为big-endian无符号整数的字节,设置z为该值,然后返回z.
这应该在您的应用程序中使用非常简单,因为根据您链接的文档,您的密钥是大端格式.
import "math/big"
z := new(big.Int)
z.SetBytes(byteSliceHere)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8300 次 |
| 最近记录: |