Portmaster 随机数发生器(rng)熵质量测试指南:tickFeeder 与 Fortuna 的 dieharder 验证实践
网络安全【免费下载链接】portmaster Love Freedom - ❌ Block Mass Surveillance项目地址https://gitcode.com/gh_mirrors/po/portmaster点击查看免费下载本篇指南围绕 Portmaster 项目base/rng随机数包的熵质量测试方案展开完整说明其熵源架构OS 熵源 tickFeeder 调度器抖动熵源 完整馈送器如何汇聚到 Fortuna CSPRNG以及如何通过rng/test测试程序生成随机数据、使用 dieharder 套件检验其统计随机性。读完本文你将掌握熵质量测试的标准操作流程、测试程序的运行参数、输出文件解读方法以及 Portmaster 随机数包在重播种reseed策略与熵池管理上的实现细节。为什么 Portmaster 需要自建熵测试Portmaster 是一款以“阻止大规模监控”为核心理念的网络安全应用详见仓库根目录 README.md其核心功能SPN 匿名网络、TLS 指纹混淆、流量伪装等对加密密钥与随机数的质量有极高要求。为此项目在 base/rng/doc.go 中明确声明rng包提供的是一个可馈送feedable的 CSPRNG底层使用 Fortuna 生成器github.com/seehuhn/fortuna默认由两条熵源驱动以crypto/rand的种子启动并定期从操作系统熵源重新播种一个极其简单的tickFeeder通过 goroutine 从 Go 内部调度器中提取熵设计意图是在程序处于负载状态下工作得更好。base/rng/test/README.md 正是这套熵架构的“质检报告与操作手册”——它说明了如何证明系统生成的随机数据“足够随机”并给出了真实环境的 dieharder 测试结果。架构速览从熵源到 Fortuna 的完整链路从源码结构看base/rng 包的熵生成链路由以下组件协作完成组件文件职责Fortuna 生成器rng.go底层 CSPRNG通过newCipher支持 AES 或 Serpent 两种分组密码熵池 Feederentropy.go统一熵收集接口聚齐 256 位minFeedEntropy熵后才向上游输出OS 熵源osfeeder.go周期性调用crypto/rand读取系统熵调度器抖动熵源tickfeeder.go采集UnixNano最低位比特模拟运行负载完整馈送器fullfeed.go定期清空rngFeeder管道中的积压熵并Reseed对外接口get.go提供Read/Bytes/Number等读取入口并负责按字节数/时间触发重播种初始化流程见 rng.go 的Start()先以 OS 熵异步完成首次Reseed随后并行启动三个后台 worker——osFeeder、tickFeeder与fullFeeder共同向 Fortuna 喂入熵。tickFeeder为什么每个字节只折算 1 位熵tickFeeder的实现tickfeeder.go每次“滴答”时执行value (value 1) | (time.Now().UnixNano() % 2)即取当前纳秒时间戳的最低有效位推入一个 64 位移位寄存器凑满 64 次推送后组装成 8 字节通过Feeder送入熵池并在entropyData中只声明 8 位熵每字节 1 位。README 对这一保守估值的解释是tickFeeder 的输出永远不会被直接使用而是作为熵喂给 Fortuna为了保证最终熵质量足够高期望每生成 1 字节只折算 1 位熵即采集量为所需量的 8 倍“we gather 8 times the amount we need”。与之对照OS 熵源在 osfeeder.go 中同样每次取minFeedEntropy/8字节但按满额entropyBytes * 8位申报——因为crypto/rand的输出被视为高置信度随机。tickFeeder 的滴答间隔由getTickFeederTickDuration()tickfeeder.go动态计算目标是在重播种周期默认 600 秒的 1/10 时间内攒满minFeedEntropy256 位熵因此每个 tick 只贡献 0.125 位需要256 * 8 2048次滴答算出约 29ms 间隔若计算结果低于 10ms则强制取 10ms 下限。值得注意的是tickFeeder官方注释强调程序负载越高质量越好——因为 Go 调度器无法立即唤醒就绪的 goroutine使时间戳最低位抖动更剧烈。运行熵测试生成随机数据样本第一步构建测试程序测试程序位于 base/rng/test/main.go用法为./test {fortuna|tickfeeder} file [output size in MB]在 base/rng/test 目录下先构建go build第二步选择测试模式并生成样本README 给出的两种模式./test tickfeeder tickfeeder.out 1 # 仅输出附加熵源tickFeeder的原始数据 # OR ./test fortuna fortuna.out 10 # 输出带全部熵源的真实 CSPRNG 数据参数含义由 main.go 的prep()解析第一个参数是模式fortuna或tickfeeder其余值直接报 usage 错误第二个参数是输出文件路径以os.O_CREATE|os.O_WRONLY、权限0644打开第三个可选参数是输出大小MB内部按n * 1000000换算成字节默认outputSize为1000000字节即 1MB。在fortuna模式下程序调用rng.Bytes(64)循环取数并写入文件每写满 1024 字节向 stderr 输出一个.进度点每 65536 字节打印累计字节数见 main.go。在tickfeeder模式下main.go测试程序会直接复刻 tickFeeder 的采样逻辑——每 10 纳秒睡眠后采集UnixNano() % 2并入位攒满 64 位写 8 字节同时并行运行一个noise()goroutinemain.go用 AES-CTR 不断做流加密运算制造 CPU 负载模拟真实运行环境下调度器抖动。第三步用 dieharder 检验随机性对生成的样本文件运行 dieharder一款经典随机数统计测试套件dieharder -a -f output.bin-a表示运行全部可用测试-f指定输入二进制文件。dieharder 会输出每个测试的名称如diehard_birthdays、sts_serial、rgb_lagged_sum、ntup/tsamples/psamples 等参数、p-value 以及PASSED/WEAK的评估结论。实测结果解读如何判断“通过”README 提供了两组真实测试输出作为参照基准结论要点如下少量测试失败是正常的甚至是期望的README 明确指出“around 5 tests ofdiehardernormally fail. This is expected and even desired.”——真正的 CSPRNG 不应在每次跑分中让全部测试恰好通过出现零星 WEAK/失败恰恰是统计自然波动的体现rng 当前在输出 1MB 或经过 10 分钟后重新播种对应 get.go 中reseedAfterBytes 10485761MB与reseedAfterSeconds 60010 分钟两个常量Fortuna 全链路样本10MBgo1.14.2 linux/amd642020-04-21100 余项测试几乎全部PASSED仅少量如diehard_squeeze、sts_serial、rgb_permutations、rgb_lagged_sum等在单一样本上出现WEAK但第二样本2nd sample均恢复PASSED纯 tickFeeder 原始样本22KB 上下文切换输出go1.10.3 linux/amd642018-08-23同样绝大多数测试PASSED个别WEAK如diehard_opso、diehard_sums、sts_serial、dab_monotobit2但整体分布良好——这验证了即使只取 tickFeeder 的原始比特流其统计特性也足以支撑熵池。需要强调的是tickFeeder 原始输出的WEAK是预期内的因为它只是熵源而非最终随机数出口真正的安全随机数一律来自经过 Fortuna 混合后的输出而 Fortuna 样本的测试结果显著更稳。源码级解读重播种Reseed机制如何支撑熵测试dieharder 测试“随机性”的背后是 get.go 中checkEntropy()实现的按需重播种策略if rngBytesRead reseedAfterBytes || int(time.Since(rngLastFeed).Seconds()) reseedAfterSeconds { select { case r : -rngFeeder: rng.Reseed(r) rngBytesRead 0 rngLastFeed time.Now() case -time.After(1 * time.Second): return errors.New(failed to get new entropy) } }每次Read/Bytes调用都会检查是否已累计读取超过 1MB或距上次馈送超过 600 秒若需要重播种会从rngFeeder管道取一批熵数据执行Reseed若 1 秒内拿不到新熵则返回错误——这是熵池饥饿的显式防护fullFeederfullfeed.go则按reseedAfterSeconds * 5至少 600 秒的周期清空rngFeeder中所有积压数据避免熵数据滞留过久。熵池侧Feeder.run()entropy.go只有在累计声明的熵达到minFeedEntropy256 位后才把缓冲区整体送入rngFeeder管道。此外 entropy.go 还提供了SupplyEntropy/SupplyEntropyIfNeeded/SupplyEntropyAsInt等对外接口供其他模块如 SPN 的加密握手向 RNG 注入额外熵源——这正是doc.go中“can also be easily fed with additional sources”的设计兑现。单元测试中的自检路径除 dieharder 这类外部统计工具外包内还内置了 rng_test.go 作为持续集成自检它启动完整模块后依次验证 AES 与 Serpent 两种密码模式的newCipher创建、Read、Reader.Read、Bytes(32)与Number(100)等全部公开接口是否可用。这保证了每次构建时随机数链路的基本可用性而 dieharder 则负责对统计质量做更严格的抽样验证——两者形成“功能性 统计性”的双层测试矩阵。小结Portmaster 的熵质量测试方案可以概括为三条可操作结论测试入口cd base/rng/test go build随后用./test fortuna fortuna.out 10或./test tickfeeder tickfeeder.out 1生成样本检验工具dieharder -a -f 输出文件重点观察绝大多数测试PASSED、仅零星WEAK即可视为通过设计意图tickFeeder 每字节只按 1 位熵保守申报8 倍采集Fortuna 负责混合浓缩1MB/10 分钟的重播种策略保证前向安全——整套机制确保了 Portmaster 加密功能所依赖的随机数在统计与安全两个维度上都站得住脚。赞分享网络安全【免费下载链接】portmaster Love Freedom - ❌ Block Mass Surveillance项目地址https://gitcode.com/gh_mirrors/po/portmaster点击查看免费下载相关推荐终极指南mbedtls随机数质量评估与嵌入式熵源测试终极指南mbedtls随机数质量评估与嵌入式熵源测试 mbedtls作为一款开源的TLS库和PSA加密API参考实现在嵌入式环境中提供了可靠的随机数生成功能网络安全密码学通信嵌入式ESP-IDF 随机数生成RNG完全指南从硬件熵源到 esp_random / getrandom / getentropy API 实战ESP IDF 随机数生成RNG完全指南从硬件熵源到 esp_random / getrandom / getentropy API 实战 ESP IDF物联网嵌入式Tachyon随机测试生成器rng.h与边界条件验证实践Tachyon随机测试生成器rng.h与边界条件验证实践 在零知识证明Zero Knowledge, ZK系统开发中随机数生成器Random Numb密码学区块链高性能计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

RD-AGENT 第一讲 · AI 因子工厂是怎么运转的

RD-AGENT 第一讲 · AI 因子工厂是怎么运转的

第一讲 AI 因子工厂是怎么运转的《AI 挖因子时,如何不被自己和 AI 骗到》第一章第一讲 学习目标:理解 RD-Agent 类因子挖掘循环的五个步骤、人与 AI 的分工边界;能看懂一次循环的执行记录。1. 开场:一台真实跑过的机器 这门课的素…

2026/10/7 23:53:58 阅读更多 →
AI 日报 · 2026-10-06

AI 日报 · 2026-10-06

一、AI Coding 方向1. Reflection AI 发布开放权重模型 Beam:501B 稀疏 MoE,SWE-bench Verified 80.9Reflection AI 推出首个开放权重模型 Beam——501B 参数稀疏 MoE、23B 激活、1M token 上下文、Apache 2.0;预训练在 6144 张 GB300 NVL72 …

2026/10/7 23:53:57 阅读更多 →
英文论文Turnitin检测95%?2026年5月实测降AI工具稳降至20%以下

英文论文Turnitin检测95%?2026年5月实测降AI工具稳降至20%以下

之前把写完的初稿发给导师,内容没什么大问题,可英文部分的AI痕迹占比特别高!自己用Turnitin跑了次检测,数值居然到95%,当时盯着结果半天没反应过来。 英文内容降AI痕迹确实有难度,不少留学生都找不到合适的…

2026/10/7 23:52:57 阅读更多 →

最新新闻

生产级Coding Agent调优实战:Harness工程化决定落地下限

生产级Coding Agent调优实战:Harness工程化决定落地下限

1. 从"能跑"到"好用":生产级 Coding Agent 的最后一公里到底卡在哪Vibe Coding 这个词这两年被聊得很多,大意是开发者用自然语言描述意图,让 Coding Agent 去生成、修改、验证代码,人只负责把握方向和验收。听…

2026/10/9 6:35:27 阅读更多 →
Java Swing人事管理系统:JDBC+MySQL课程设计实战与避坑指南

Java Swing人事管理系统:JDBC+MySQL课程设计实战与避坑指南

简介:这份资源是一套基于 Java Swing、JDBC 与 MySQL 实现的人事管理系统课程设计项目,面向正在完成数据库课程设计、需要可运行参考案例的计算机相关专业学生。项目包含可视化软件界面,覆盖人员信息维护、数据库连接与增删改查等典型业务场景…

2026/10/9 6:35:27 阅读更多 →
MySQL校对规则:utf8mb4_general_ci与utf8mb4_bin的差异及选型

MySQL校对规则:utf8mb4_general_ci与utf8mb4_bin的差异及选型

1. 这两个校对规则到底在吵什么看你一脸问号地点进来,我猜你多半是遇到过这种情况:建表的时候复制了一段别人的SQL,里面有CHARSETutf8mb4 COLLATEutf8mb4_general_ci,或者是utf8mb4_bin,当时也没多想,能用就…

2026/10/9 6:35:27 阅读更多 →
PS5底层开发合规边界与技术可行性分析

PS5底层开发合规边界与技术可行性分析

我无法根据当前输入生成符合要求的博文。原因如下:项目标题 "AnyPS5" 缺乏明确指向性:该词在公开技术语境中无公认定义,既非官方产品名(索尼未发布/命名过 AnyPS5)、非开源项目(GitHub、GitLab、…

2026/10/9 6:35:27 阅读更多 →
claude-mem:为Claude Code打造跨会话长期记忆的实战指南

claude-mem:为Claude Code打造跨会话长期记忆的实战指南

用过 Claude Code 写真实项目的人,基本都遇到过这个场景:昨天刚跟 AI 讨论清楚的一个架构方案,今天新开一个会话,它完全不记得了。你在同一个仓库里翻历史对话记录,发现上一个会话已经把项目的来龙去脉都喂给了它&…

2026/10/9 6:35:27 阅读更多 →
Agent-Reach:LLM API智能路由与成本可控调度中枢

Agent-Reach:LLM API智能路由与成本可控调度中枢

1. 项目概述:Agent-Reach 是什么?它解决的不是“能不能用”,而是“怎么用得稳、用得准、用得省”Agent-Reach 这个名字乍看像某个开源模型或工具库,但结合 CLI、API、YouTube、Reddit 这些高频热词,再叠加上“zcode cl…

2026/10/9 6:34:27 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →