我正在编写一个 C 内核模块来拦截和修改 __x64_sys_getrandom() 系统调用。 OpenSSL 3.0 DRBG 正在使用此调用来请求 48 字节的系统熵来为其 DRBG 播种。我已经成功地做到了这一点。 OpenSSL DRBG 还使用系统中的其他几个信息源来增加熵和安全性。我想知道 3.0 版本的它们是什么。
基于
openssl rand 32
的Strace,调用getpid(),查询系统时间、时钟等。
strace 的一个片段是:
sysinfo({uptime=603, loads=[27168, 13248, 4352], totalram=4114882560, freeram=3620864000, sharedram=778240, bufferram=15073280, totalswap=0, freeswap=0, procs=113, totalhigh=0, freehigh=0, mem_unit=1}) = 0
futex(0x7fe2bdb8c7d4, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7fe2bdae7458, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7fe2bdae5f20, FUTEX_WAKE_PRIVATE, 2147483647) = 0
brk(0x55915c544000) = 0x55915c544000
getpid() = 9102
brk(0x55915c565000) = 0x55915c565000
brk(0x55915c58b000) = 0x55915c58b000
brk(0x55915c5ac000) = 0x55915c5ac000
// This is hooked
getrandom("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 48, 0) = 48
getpid() = 9102
getpid() = 9102
getpid() = 9102
getpid() = 9102
newfstatat(1, "", {st_mode=S_IFCHR|0666, st_rdev=makedev(0x1, 0x3), ...}, AT_EMPTY_PATH) = 0
这可能是加密 StackExchange 的一个问题,但如果所有或大部分这些位都是已知的,那么暴力破解密钥流的复杂性是多少?假设初始 getrandom() 熵是 100% 已知的?