Ce face crypto/rand.Prime
rand.Prime(rand.Reader, 512) returnează un număr aleatoriu de exact 512 biți care este prim cu o probabilitate covârșitoare (testele folosite greșesc mai rar de o dată la 2100). Numerele prime mari stau la baza algoritmilor cu cheie publică, precum RSA.
În practică rar ai nevoie de ea direct: pachetele crypto/rsa și crypto/ecdsa generează singure cheile. Din Go 1.26 primul argument este ignorat și se folosește mereu sursa sigură a sistemului. Returnează eroare dacă bits < 2.
Parametri
| Parametru | Descriere |
|---|---|
r |
Sursa de aleatoriu; dai rand.Reader. |
bits |
Lungimea numărului în biți. |
Ce returnează
Numărul prim (*big.Int) și o eroare.
Exemple
Exemplul 1: Proprietățile numărului generat
package main
import (
"crypto/rand"
"fmt"
)
func main() {
for _, biti := range []int{16, 64, 512} {
p, err := rand.Prime(rand.Reader, biti)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%3d biți: lungime=%d, prim=%v, cifre zecimale=%d\n",
biti, p.BitLen(), p.ProbablyPrime(20), len(p.String()))
}
_, err := rand.Prime(rand.Reader, 1)
fmt.Println("1 bit:", err)
}
Rezultat
16 biți: lungime=16, prim=true, cifre zecimale=5
64 biți: lungime=64, prim=true, cifre zecimale=20
512 biți: lungime=512, prim=true, cifre zecimale=155
1 bit: crypto/rand: prime size must be at least 2-bit
Exemplul 2: Un număr prim de 64 de biți
Valoarea diferă la fiecare rulare.
package main
import (
"crypto/rand"
"fmt"
)
func main() {
p, _ := rand.Prime(rand.Reader, 64)
fmt.Println(p)
}
Rezultat posibil (diferă la fiecare rulare)
15392716890542217933
Greșeli frecvente
- Îți construiești singur chei RSA din numere prime: e ușor să greșești detalii de securitate. Folosește
rsa.GenerateKey.
Comenzi înrudite
crypto/rand.Int: Returnează un număr aleatoriu sigur, uniform în intervalul [0, max), ca *big.Int; bun pentru coduri PIN și OTP.crypto/rand.Read: Umple un slice cu octeți aleatorii siguri criptografic, luați de la sistemul de operare (chei, tokenuri, sare).