Как создать большой int с безопасным случайным

У меня есть этот код в Java, и мне нужно воспроизвести в Go.

String nonce = new BigInteger(130, new SecureRandom()).toString(32);

Это единственный способ сгенерировать одноразовый номер для мыла GDS amadeus 4.

Спасибо

2 ответа

Решение

Использовать пакет math/big а также crypto/rand, Фрагмент выглядит так:

//Max random value, a 130-bits integer, i.e 2^130 - 1
max := new(big.Int)
max.Exp(big.NewInt(2), big.NewInt(130), nil).Sub(max, big.NewInt(1))

//Generate cryptographically strong pseudo-random between 0 - max
n, err := rand.Int(rand.Reader, max)
if err != nil {
    //error handling
}

//String representation of n in base 32
nonce := n.Text(32)

Рабочий пример можно найти на игровой площадке Go.

Принятый ответ неверен, потому что функция crypto/rand rand.Int

возвращает однородное случайное значение в [0, max). Он паникует, если max <= 0. Вот ответ, который не пропускает значение 2^130 - 1.

      // Max value, a 130-bits integer, i.e 2^130 - 1
var max *big.Int = big.NewInt(0).Exp(big.NewInt(2), big.NewInt(130), nil)
// Generate cryptographically strong pseudo-random between [0, max)
n, err := rand.Int(rand.Reader, max)
if err != nil {
    // error handling
}
fmt.Println(n)
Другие вопросы по тегам