密码学算法
概述
unitarylab_algorithms.cryptology 包含三个量子密码学算法,展示了量子计算在数论与隐藏周期问题上相对于经典方法的优势:
| 算法 | 类 | 求解问题 |
|---|---|---|
| Shor 质因数分解算法 | ShorAlgorithm | 合数 的质因数分解 |
| 离散对数算法 | DiscreteLogAlgorithm | 求解 |
| Simon 周期掩码算法 | SimonAlgorithm | 在 中找隐藏掩码 |
Shor 质因数分解算法
背景
Shor 算法以多项式时间复杂度将合数 分解为质因数。经典最优算法(如通用数域筛法)需要次指数时间,而 Shor 算法在量子计算机上可在 时间内完成。
该算法结合了:
- 基于量子傅里叶变换(QFT)的量子周期查找
- 从周期中提取质因数的经典后处理
导入
from unitarylab_algorithms.cryptology.shor.algorithm import ShorAlgorithm.run() 参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
N | int | — | 待分解的合数(如 15、21) |
method | str | 'matrix' | 求解方法:'matrix' 或 'operator' |
max_retries | int | 15 | 最大重试次数(每次重试重新采样基底) |
返回值
{
'status': 'ok',
'circuit_path': '/path/to/shor_circuit.svg',
'plot': [{'format': 'txt', 'filename': 'shor_result.txt'}]
}示例
from unitarylab_algorithms.cryptology.shor.algorithm import ShorAlgorithm
algo = ShorAlgorithm()
result = algo.run(N=15)
print(result['status']) # 'ok'快速演示
from unitarylab_algorithms.cryptology.shor.algorithm import test
test(N=15, method='matrix', max_retries=15)注意事项
N必须是具有至少两个不同质因子的合数。传入质数或1将导致算法失败。'matrix'方法对小 通常更快;'operator'方法更适用于较大线路。- 算法在单次
.run()调用中会对基底 最多重采样max_retries次,直到成功提取周期。
离散对数算法
背景
离散对数问题:给定 、 和 ,求 使得 。这是许多经典密码系统(如 Diffie–Hellman、DSA)的安全基础。量子算法利用量子相位估计和连分数后处理高效求解。
导入
from unitarylab_algorithms.cryptology.discrete_log.algorithm import DiscreteLogAlgorithm.run() 参数
| 参数 | 类型 | 说明 |
|---|---|---|
g | int | 幂运算的底数 |
y | int | 目标值 |
P | int | 模数(通常为质数) |
返回值
{
'status': 'ok',
'circuit_path': '/path/to/discrete_log_circuit.svg',
'plot': [{'format': 'txt', 'filename': 'discrete_log_result.txt'}]
}示例
from unitarylab_algorithms.cryptology.discrete_log.algorithm import DiscreteLogAlgorithm
# 求解 3^x ≡ 6 (mod 7),答案为 x = 3
algo = DiscreteLogAlgorithm()
result = algo.run(g=3, y=6, P=7)
print(result['status']) # 'ok'快速演示
from unitarylab_algorithms.cryptology.discrete_log.algorithm import test
test(g=3, y=6, P=7)Simon 周期掩码算法
背景
Simon 问题:给定函数 ,已知存在隐藏掩码 满足 ,求 。经典算法需要指数级查询次数,而 Simon 算法仅需 次量子查询加上经典高斯消元即可求解。
导入
from unitarylab_algorithms.cryptology.simon.algorithm import SimonAlgorithm.run() 参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
s | str | '1010' | 表示待查找隐藏掩码的二进制字符串 |
返回值
{
'status': 'ok',
'circuit_path': '/path/to/simon_circuit.svg',
'plot': [{'format': 'txt', 'filename': 'simon_result.txt'}]
}示例
from unitarylab_algorithms.cryptology.simon.algorithm import SimonAlgorithm
algo = SimonAlgorithm()
result = algo.run(s='1101')
print(result['status']) # 'ok'快速演示
from unitarylab_algorithms.cryptology.simon.algorithm import test
test(s='1101')注意事项
s必须是长度为 的二进制字符串(如'1010'对应 )。- 全零字符串
'0000'是退化情形( 为单射),算法仍可运行,但结果无实际意义。
最后更新于