You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python程序手动生成熵?无需CrypAPI能否自定义熵源?

好问题!手动生成熵、理解随机性来源是学习RNG(随机数生成器)的绝佳方式。我来一步步拆解你的问题:

一、手动在Python中生成熵的思路

熵本质是衡量数据不可预测性的指标——越难猜的数据,熵越高。手动生成熵就是去收集系统或环境里「没规律」的输入,常见的来源有这些:

  • 用户行为输入:人类的操作天生带有随机性,比如按键间隔、鼠标移动坐标的变化。可以用pynput库监听鼠标行为来收集:
from pynput.mouse import Listener
import time

entropy_buffer = []

def on_move(x, y):
    # 记录坐标变化的时间戳和差值,放大随机性
    entropy_buffer.append((time.time_ns(), x, y))

# 监听10秒鼠标移动
with Listener(on_move=on_move) as listener:
    time.sleep(10)
    listener.stop()

# 把收集到的信息转成字节流作为原始熵
raw_entropy = b''.join([str(item).encode() for item in entropy_buffer])
print(f"收集到的原始熵字节长度:{len(raw_entropy)}")
  • 系统硬件/环境噪声:比如磁盘IO的微小延迟、CPU温度波动、网络数据包的到达时间差。用psutil库可以轻松获取这些指标:
import psutil
import time

entropy_buffer = []
for _ in range(100):
    # 收集瞬时的CPU使用率、磁盘IO时间、内存使用率
    cpu_percent = psutil.cpu_percent(interval=0.01)
    disk_io = psutil.disk_io_counters().read_time
    mem_percent = psutil.virtual_memory().percent
    entropy_buffer.append((cpu_percent, disk_io, mem_percent))
    time.sleep(0.05)

# 转成字节流
raw_entropy = b''.join([str(val).encode() for sublist in entropy_buffer for val in sublist])
  • 音频/视频输入噪声:如果有麦克风,静音状态下的环境音频采样(比如电流噪声)是很好的熵源。用pyaudio库收集:
import pyaudio

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024)

# 收集1秒的音频噪声
frames = []
for _ in range(int(44100 / 1024)):
    data = stream.read(1024)
    frames.append(data)

stream.stop_stream()
stream.close()
p.terminate()

# 音频数据本身就是字节流,直接作为熵
raw_entropy = b''.join(frames)
二、不依赖Windows CryptAPI生成自定义熵

完全可以绕开CryptAPI,Python本身和第三方库提供了很多灵活的方案:

  • 手动混合多源熵:把多个独立熵源的数据用哈希函数合并(比如SHA-256),能大幅提升随机性的鲁棒性:
import hashlib

def mix_entropy(sources):
    # 合并多个熵源的字节流后做哈希,输出固定长度的高熵数据
    combined = b''.join(sources)
    return hashlib.sha256(combined).digest()

# 假设source1是鼠标熵,source2是系统指标熵,source3是音频熵
final_entropy = mix_entropy([raw_entropy_mouse, raw_entropy_system, raw_entropy_audio])
  • 第三方专用库:
    • entropy库:专门做熵收集与评估,支持从多种系统来源提取熵,且可以配置不依赖系统加密API。安装后用法很简单:
    import entropy
    # 收集1024字节的熵
    collected_entropy = entropy.collect(1024)
    
    • pycryptodome:它的Random模块默认可能调用系统API,但你可以手动替换成自定义熵源:
    from Crypto.Random import random
    from Crypto.Random import _UserFriendlyRNG
    
    # 自定义熵源生成函数,返回指定字节数的熵
    def custom_entropy_source(n):
        # 从之前收集的原始熵中截取n字节
        return raw_entropy[:n]
    
    # 替换默认的熵源
    random._randfunc = _UserFriendlyRNG.new(custom_entropy_source).read
    
三、调试熵生成过程的实用技巧

要吃透RNG,调试熵生成是关键,这里有几个实用方法:

  • 评估熵的质量:用香农熵计算工具判断收集到的数据是否足够随机,理想值接近8 bits/字节。可以用entropy库的工具:
from entropy import shannon_entropy

entropy_value = shannon_entropy(raw_entropy)
print(f"香农熵值:{entropy_value} bits/字节")
  • 可视化熵分布:把熵字节转成0-255的整数,画直方图看分布是否均匀——均匀分布的随机性才好:
import matplotlib.pyplot as plt
import numpy as np

byte_values = np.frombuffer(raw_entropy, dtype=np.uint8)
plt.hist(byte_values, bins=256)
plt.title("Entropy Byte Distribution")
plt.xlabel("Byte Value")
plt.ylabel("Frequency")
plt.show()
  • 单独测试各熵源:分别收集单个来源的数据并评估熵值,能帮你找到最靠谱的随机性来源,优化自定义熵收集器。

内容的提问来源于stack exchange,提问作者Henok Yemane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:36:28