go - 使用 nacl.Sign 并理解其 I/O 参数
问题描述
在包golang.org/x/crypto/nacl/sign
中,Sign函数有一个out []byte
参数,它返回一个字节切片。
阅读源代码,我正在努力弄清楚如何正确使用它们,它们是头部和尾部,尽管在下面的示例中,生成的字节切片为零 len。
请看下面的例子,
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
"golang.org/x/crypto/nacl/sign"
)
func main() {
_, priv, err := sign.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
msg := []byte("hello world!")
out := make([]byte, 0, len(msg)+sign.Overhead)
ret := sign.Sign(out, msg, priv)
fmt.Printf("len(msg): %v %s\n", len(msg), msg)
fmt.Printf("len(out): %v %v\n", len(out), base64.StdEncoding.EncodeToString(out))
fmt.Printf("len(ret): %v %v\n", len(ret), base64.StdEncoding.EncodeToString(ret))
}
// Output:
// len(msg): 12 hello world!
// len(out): 0
// len(ret): 76 h+ZkFoWxuxOj7zV3tekiQz/z/yfuvXNUHxBjklo4iGBy7PfCEwvAiy3gi7GnuYGWB3SMxuxHtV5tNuUL1b3kAGhlbGxvIHdvcmxkIQ==
我不明白为什么 Sign 会同时返回和返回。我不确定要签署.Sign 的输出缓冲区应该多长时间。
相反,这个例子有效,但它是否正确?
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
"golang.org/x/crypto/nacl/sign"
)
func main() {
pub, priv, err := sign.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
msg := []byte("hello world!")
out := make([]byte, 0, len(msg)+sign.Overhead)
ret := sign.Sign(out, msg, priv)
fmt.Printf("len(msg): %v %s\n", len(msg), msg)
fmt.Printf("len(out): %v %v\n", len(out), base64.StdEncoding.EncodeToString(out))
fmt.Printf("len(ret): %v %v\n", len(ret), base64.StdEncoding.EncodeToString(ret))
openOut := make([]byte, 0, len(ret)-sign.Overhead)
res, ok := sign.Open(openOut, ret, pub)
if !ok {
panic("failed to open signed message")
}
fmt.Printf("len(res): %v %s\n", len(res), res)
}
// Output:
// len(msg): 12 hello world!
// len(out): 0
// len(ret): 76 h+ZkFoWxuxOj7zV3tekiQz/z/yfuvXNUHxBjklo4iGBy7PfCEwvAiy3gi7GnuYGWB3SMxuxHtV5tNuUL1b3kAGhlbGxvIHdvcmxkIQ==
// len(res): 12 hello world!
期待一些解释和正确性帮助。
解决方案
推荐阅读
- java - 如何在 Spring 中将自定义字段添加到投影中
- javascript - 所以我在 React 中创建了一个回调函数,我正在调用它,但它一直显示它未定义的错误
- python - 使用python标记日期编码并基于季度创建新属性
- python - Selenium 中的 ActionChains 未单击按钮(Python)
- python - 为什么元组列表可以转换为字典,而元组的元组不能
- javascript - 如何将数组添加到数据中的特定对象?
- c++ - Xor Equality(codechef may 21 挑战)对于某些值,例如 n=4589,我得到了错误的结果,感谢您的帮助:)
- cookies - Universal_cookie__WEBPACK_IMPORTED_MODULE_3__.default.remove 不是函数
- multithreading - @spawn fetch 和 @sync @sync 在 julia 之间有什么区别
- reactjs - 将 FB/Google 用户从 NextAuth 存储并验证到 Nextjs 中的另一个后端 api