crypto/rand.Prime în Go

Generează un număr prim aleatoriu cu exact numărul de biți cerut (cu probabilitate foarte mare de a fi prim).

Sintaxă
func Prime(r io.Reader, bits int) (*big.Int, error)

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