솔라리스에서 난수 생성?

솔라리스에서 난수 생성?

Solaris에서 난수를 생성하는 가장 좋은 방법은 무엇입니까?

이에 대한 좋은 답을 찾을 수 없는 것 같습니다. 대부분의 결과가 내 환경에서는 작동하지 않습니다. $RANDOM과 비슷한 방식으로 작동하는 변수나 명령 RAND를 갖는 것이 논리적인 것 같습니다. 대부분의 검색에서 본 적이 있지만 항상 0이 생성됩니다.

이 명령을 찾았습니다

od -X -A n /dev/random | head -2

이것은 무작위로 보이지만 반환 형식은 (나에게) 이상합니다.

     140774 147722 131645 061031 125411 053337 011722 165106
     066120 073123 040613 143651 040740 056675 061051 015211

현재 사용되는 것:

-bash-3.2$ uname -a
SunOS XXXXXXXXX 5.10 Generic_150400-29 sun4v sparc SUNW,SPARC-Enterprise-T5120

답변1

$RANDOMksh 및 bash에서 사용 가능하지만 /bin/sh. 값은 0에서 32768 사이의 임의의 숫자이므로 암호화에 적합하지 않습니다.

읽기는 /dev/random암호화 사용에 적합한 임의 바이트 스트림을 생성합니다. 이는 널 바이트를 포함할 수 있는 임의 바이트이므로 쉘 변수에 저장할 수 없습니다. $n파일에 바이트를 저장할 수 있습니다

</dev/random dd ibs=1 count=$n >rnd

od8진수 또는 16진수 값을 사용하여 이러한 바이트를 인쇄 가능한 표현으로 변환 할 수 있습니다 . 출력이 "이상하다"면 다른 od옵션을 선택해야 할 수도 있습니다.

인쇄 가능한 표현을 얻는 또 다른 옵션은 uuencodeGenerate Base64를 호출하는 것입니다.

</dev/random dd ibs=1 count=$n | uuencode -m _ | sed -e '1d' -e '$d'

답변2

다음은 바이트(16진수로 표시 n)를 가져오는 세 가지 방법입니다.2*n

#!/bin/bash
n=64
# Read n bytes from urandom (in hex).
xxd -l "$n" -p                    /dev/urandom | tr -d " \n" ; echo
od  -vN "$n" -An -tx1             /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e ' /1 "%02x"'  /dev/urandom ; echo

urandom에서 읽습니다(반드시 urandom을 사용하십시오).

16진수는 파일로 리디렉션되거나 변수에 저장될 수 있습니다.

 a="$(xxd -l "$n" -p /dev/urandom)"

xxd를 사용하여 다음과 같이 원시 바이트를 얻을 수 있습니다.

## 경고, 이는 바이너리 값을 생성합니다

echo "$a" | xxd -r -p      # If the Hex digits are in a variable.
xxd -r -p "$rndfile"       # If the Hex digits are in a file.

xxd를 사용할 수 없고 16진수가 있다고 가정하면 $a다음
bash 코드를 사용할 수 있습니다.

#!/bin/bash

>"$rndfile"                            # erase the file

for (( i=0; i<${#a}/2; i++ )); do      # do a loop over all byte values.

    # convert 2 hex digits to the byte unsigned value:
    printf '%b' $(printf '\\0%o' "0x${a:$i*2:2}") >> "$rndfile"

    b="${b#??}"  # chop out two hexadecimal digits.

done

또는 이 sh 호환 코드를 사용해 볼 수도 있습니다(bash에서 쉽게 실행되어야 함). 예, sh와 호환되어야 합니다. 문제를 발견하면 신고해주세요.

대시에서만 테스트되었습니다(그러나 다른 일부에서는 작동해야 함).

#!/bin/sh

i=$((${#a}/2))          # The (length of $a ) / 2 is the number of bytes.
b="$a"                  # use a temporal variable. It will be erased.
: >"$rndfile"           # erase file contents

while [ $i != 0 ]; do

    # Write one byte transformed to binary:
    printf '%b' $(printf '\\0%o' "0x${b%"${b#??}"}") >> "$rndfile"

    b="${b#??}"  # chop out two hexadecimal digits.
    i=$((i-1))   # One byte less to finish.

done

답변3

</dev/random \
dd bs="${num_len}" count=1 | LC_ALL=C \
tr -c 0-9 "$(printf '[%d*24]' 9 8 7 6 5 4 3 2 1)[0*]"

숫자 분포는 0에 매우 적합하지만 10진법에서는 잘 작동하고 아무 것도 낭비되지 않습니다.

$(...)Solaris v<11의 경우 명령 대체 대신 ` 백틱을 사용해야 합니다 .

관련 정보