일반적으로 읽기 작업 /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/random
Anthony는 쓰기가 엔트로피 수를 증가시키지 않는다고 설명 하고 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)를 사용한다는 점을 제외하고는 확인되지 않았습니다.