展示如何生成用于签名或加密的特定大小的密钥。 a. 密钥生成基本上就是调用 rand.Read 并传入一个特定大小的切片,所以我不确定这是否会是一个有用的例子。
实际上实现一个简单的基于随机性的密码。 a. 我喜欢提供一个简单的一次性密码实现,以展示如何在加密算法中使用随机字节。 以下是一个示例实现:
package main
import (
"crypto/rand"
"fmt"
)
func main() {
plaintext := []byte("Something something gopher...")
n := len(plaintext)
key := make([]byte, n)
ciphertext := make([]byte, n)
// Read n random bytes into key. A one-time pad requires the key to be at least as long as the plaintext.
if _, err := rand.Read(key); err != nil {
fmt.Println(err)
return
}
fmt.Printf("Original: %x\n", plaintext)
// Encrypt message by XOR'ing the plaintext and the key.
for i := 0; i < n; i++ {
ciphertext[i] = plaintext[i] ^ key[i]
}
fmt.Printf("Encrypted: %x\n", ciphertext)
// Decrypt message by XOR'ing the ciphertext and the key.
for i := 0; i < n; i++ {
ciphertext[i] = ciphertext[i] ^ key[i]
}
fmt.Printf("Decrypted: %x\n", ciphertext)
}
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func main() {
// Choose two random primes p and q
p, err := rand.Prime(rand.Reader, 100)
if err != nil {
fmt.Println(err)
return
}
q, err := rand.Prime(rand.Reader, 100)
if err != nil {
fmt.Println(err)
return
}
// Let n = p * q
var n big.Int
n.Mul(p, q)
// Let totient = (p - 1) * (q - 1)
one := big.NewInt(1)
p.Sub(p, one)
q.Sub(q, one)
var totient big.Int
totient.Mul(p, q)
// Let e be coprime to the totient
e := big.NewInt(3)
// Let d satisfy d*e ≡ 1 mod totient
var d big.Int
d.ModInverse(e, &totient)
fmt.Printf("Public Key-Pair: (%s, %s)\n", n.Text(10), e.Text(10))
fmt.Printf("Private Key-Pair: (%s, %s)\n", n.Text(10), d.Text(10))
}
6条答案
按热度按时间oiopk7p51#
同意Read示例应该是一个包级别的示例。它主要展示了该包最常用的用法。
qni6mghb2#
想要获得加密安全的随机机器大小整数似乎对我来说是一个非常模糊的使用场景。来自math/rand的便捷辅助函数在加密代码中并没有很多合理的应用。
n3ipq98p3#
如果我们不展示如何实现其中一个数学/随机数函数,那么我们有两个选择。
a. 密钥生成基本上就是调用
rand.Read
并传入一个特定大小的切片,所以我不确定这是否会是一个有用的例子。a. 我喜欢提供一个简单的一次性密码实现,以展示如何在加密算法中使用随机字节。
以下是一个示例实现:
一个示例输出可能会产生类似的东西:
7tofc5zh4#
我不确定这是正确的道路,但$x_{
rand.Prime
}$的一个例子可以是普通的RSA密钥生成。显然,我们必须警告用户不要在生产环境中实际运行此命令。$x_{
}$
7cwmlq895#
https://golang.org/cl/119335提到了这个问题:
crypto/rand: Add package-level examples
nr7wwzry6#
我希望能够收到关于这些示例的反馈或批评,以便它们对Go程序员有用。CL只是一个起点,希望您的评论能够被纳入到适当的包级示例中。