/dev/random에 쓰는 것이 /dev/random의 병렬 읽기를 더 빠르게 하지 않는 이유는 무엇입니까?

/dev/random에 쓰는 것이 /dev/random의 병렬 읽기를 더 빠르게 하지 않는 이유는 무엇입니까?

일반적으로 읽기 작업 /dev/random으로 인해 100-500바이트가 생성되고 엔트로피가 수집될 때까지 기다리는 블록이 생성됩니다.

/dev/random다른 프로세스로 정보를 쓰면 읽는 속도가 빨라지지 않는 이유는 무엇입니까 ? 필요한 엔트로피를 제공하면 안 되나요?

gpg재부팅하고 모든 것을 다시 입력할 필요 없이 잠금 해제 또는 유사한 소프트웨어를 잠금 해제하거나 초일급 비밀 키가 아닌 키를 생성하는 데 유용합니다 .

답변1

/dev/random추가 임의 바이트를 제공하는 방법의 일부이므로 작성할 수 있지만 /dev/random그것만으로는 충분하지 않습니다. 또한 추가 엔트로피가 있음을 호출하여 시스템에 알려야 합니다 ioctl().

내 테스트에도 동일한 기능이 필요합니다.스마트 카드 설정 프로그램, 마우스/키보드가 각 테스트 실행에 대해 여러 호출을 수행하기에 충분한 콘텐츠를 생성할 때까지 기다리고 싶지 않기 때문입니다 gpg. 내가 하는 일은 테스트와 동시에 Python 프로그램을 실행하는 것입니다. 당연히 그래야지아니요무작위 문자열은 전혀 무작위가 아니기 때문에 실제 gpg키 생성에 적합합니다(시스템에서 생성된 무작위 정보는 여전히 인터리브됩니다). 문자열을 설정할 외부 소스가 있는 경우 random높은 엔트로피를 가질 수 있어야 합니다. 다음을 사용하여 엔트로피를 확인할 수 있습니다.

cat /proc/sys/kernel/random/entropy_avail

프로그램:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(완료되면 프로그램을 종료하는 것을 잊지 마세요.)

답변2

일반적으로 커널 개발자가 설계했으며 다음 문서에 문서화되어 있습니다 man 4 random.

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

답변3

/dev/randomAnthony는 쓰기가 엔트로피 수를 증가시키지 않는다고 설명 하고 RNDADDENTROPY ioctl을 시연했습니다(참조:랜덤(4))를 사용하여 엔트로피를 계산할 수 있습니다. 분명히 실제로는 안전하지 않으므로 하드웨어 난수 생성기를 사용할 수 있게 되면 대안이 됩니다.

다음 구현에서는 엔트로피 풀에서 512바이트(4096비트)의 임의성을 가져와 /dev/hwrng이를 엔트로피 풀로 전달합니다. 각 바이트에는 4비트의 엔트로피가 부여되며 이는 제가 임의로 선택한 것입니다. 그 후에는 호출됩니다.선택(2)엔트로피 풀이 가득 차면 차단하는 시스템 호출(에 설명되어 있음)랜덤(4)맨페이지).

파이썬 버전:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

Arch Linux iso에는 Python이 설치되어 있지 않으므로 Perl 버전도 있습니다.

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

이것은 rngd 프로그램의 일부일 수 있습니다.RNG 도구)는 이미 일반적으로 사용 가능한 도구(Python 또는 Perl)를 사용한다는 점을 제외하고는 확인되지 않았습니다.

관련 정보