go crypto/rand: add package example

vql8enpb  于 4个月前  发布在  Go
关注(0)|答案(6)|浏览(43)

crypto/rand包没有包示例;即使只是将Read示例复制到包级别也会有所帮助。
crypto/rand包也没有math/rand具有的相同便利助手,因此可能有助于了解如何使用crypto/rand包实现Intn。

oiopk7p5

oiopk7p51#

同意Read示例应该是一个包级别的示例。它主要展示了该包最常用的用法。

qni6mghb

qni6mghb2#

想要获得加密安全的随机机器大小整数似乎对我来说是一个非常模糊的使用场景。来自math/rand的便捷辅助函数在加密代码中并没有很多合理的应用。

n3ipq98p

n3ipq98p3#

如果我们不展示如何实现其中一个数学/随机数函数,那么我们有两个选择。

  1. 展示如何生成用于签名或加密的特定大小的密钥。
    a. 密钥生成基本上就是调用 rand.Read 并传入一个特定大小的切片,所以我不确定这是否会是一个有用的例子。
  2. 实际上实现一个简单的基于随机性的密码。
    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)
}

一个示例输出可能会产生类似的东西:

Original: 536f6d657468696e6720736f6d657468696e6720676f706865722e2e2e
Encrypted: 43595ee3ae72a73a8da5a253bd4fce592a27c91cbae902128a56e42be4
Decrypted: 536f6d657468696e6720736f6d657468696e6720676f706865722e2e2e
7tofc5zh

7tofc5zh4#

我不确定这是正确的道路,但$x_{rand.Prime}$的一个例子可以是普通的RSA密钥生成。显然,我们必须警告用户不要在生产环境中实际运行此命令。

$x_{

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))
}

}$

7cwmlq89

7cwmlq895#

https://golang.org/cl/119335提到了这个问题:crypto/rand: Add package-level examples

nr7wwzry

nr7wwzry6#

我希望能够收到关于这些示例的反馈或批评,以便它们对Go程序员有用。CL只是一个起点,希望您的评论能够被纳入到适当的包级示例中。

相关问题