oiko-nomikos/XOR-Values
GitHub: oiko-nomikos/XOR-Values
一个基于 C++17 的实验性项目,结合 CPU 时序抖动熵源与递归异或分解,演示真随机数生成和二进制无损分解树的构建与重建。
Stars: 0 | Forks: 0
# 🔐 熵驱异或压缩器
一个 C++ 实验,旨在实现基于硬件熵的随机比特生成以及基于递归异或的二进制压缩。
## 💡 核心思想
本项目结合了两个有趣的概念:
1. **真随机数生成**:通过 CPU 时序抖动——从真实的硬件噪声中收集熵,而不是使用确定性的伪随机数生成器 (PRNG)。
2. **递归异或压缩**——一种新颖的方案,将二进制字符串逐层缩减至单个比特,并存储完全重建原始数据所需的密钥和异或残差。
## 🧩 组件
### SystemClock
一个围绕 `std::chrono::system_clock` 的轻量级封装,提供各种分辨率(秒、毫秒、微秒、**纳秒**)下的当前时间。
### CRYPTO::SHA256
一个独立、无依赖的 SHA-256 实现。用于将原始熵比特白化并压缩为高质量的伪随机输出。支持:
- `update(data)` —— 输入字节或字符串
- `digest()` —— 返回 64 个字符的十六进制哈希值
- `digestBinary()` —— 返回 256 个字符的二进制字符串 (`0`/`1`)
### RandomNumberGenerator
核心熵收集器。它的工作原理是:
1. 以纳秒为单位对一个微小的 CPU 循环 (`countdown()`) 进行计时
2. 将每次测量值与移动平均值进行比较,以分配 `0` 或 `1` 比特
3. 将比特累积到 512 位的滑动窗口中
4. 使用 SHA-256 对每个窗口进行哈希处理,以产生白化后的 256 位输出
### BinaryEntropyPool
一个线程安全的池,用于缓冲熵比特串。它会在需要更多比特时通过调用 `RandomNumberGenerator::run()` 延迟补充自身,然后精确输出所请求数量的比特。
### XORCompress
本项目的主角。给定一个长度为 *2ⁿ* 的二进制字符串,它会递归地将其减半:
```
For each pair (A, B):
XOR result = A XOR B
Key = A
```
**密钥**成为下一层的输入。**异或结果**作为残差存储。此过程重复进行,直到只剩下单个比特。
**解压缩**以相反的顺序重放各层,通过其密钥和异或残差重建每一对。
还包括用于在任意字符串 ↔ 二进制 ASCII 之间转换的辅助工具,以便压缩文本。
## 🚀 用法
```
g++ -std=c++17 -O2 -o program main.cpp
./program
```
该程序将:
1. 从硬件时序抖动中生成 64 个熵比特
2. 使用 XORCompress 递归压缩它们
3. 打印每一层的密钥和异或残差
4. 解压缩并验证往返过程
## 📋 示例输出
```
bitstream: 1011001101110010... (64 bits)
Compressing...
Final bit: 1
Layers: 6
Keys:
Layer 0: 10110011...
Layer 1: 11001011...
...
Restored: 1011001101110010...
SUCCESS: data restored correctly
```
## 🔬 笔记与观察
- 这**不是传统的压缩算法**——存储的密钥 + 异或残差的总和大于原始输入。最好将其视为一棵**无损分解树**。
- 熵源依赖于平台;时序抖动的质量因 CPU、OS 调度器和负载而异。
- SHA-256 白化确保了无论原始抖动质量如何,输出的比特分布都是均匀的。
- `main()` 中被注释掉的《创世记》1:1–3 段落是文本压缩路径的一个有趣测试向量。😄
## 🛠️ 潜在扩展
- 从后台线程流式传输熵池以获得更高的吞吐量
- 对比特偏差进行基准测试并对输出运行 NIST 随机性测试
- 探索将异或树结构用作类似 Merkle 的完整性方案
- 将压缩层可视化为二叉树
由 VS Code、NSA 和 ChatGPT 设计与开发。
©Oiko Nomikos
标签:C++, CPU时钟抖动, SHA-256, XOR压缩, 二进制处理, 位运算, 信息论, 加密基础组件, 哈希算法, 安全与隐私, 安全算法, 实验性项目, 密码学, 异或算法, 手动系统调用, 数据压缩, 数据擦除, 数据编码, 熵池, 熵源, 真随机数, 硬件熵, 系统时钟, 线程安全, 软件开发, 递归算法, 随机数生成, 高精度计时