惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
G
Google Developers Blog
Apple Machine Learning Research
Apple Machine Learning Research
V
Visual Studio Blog
WordPress大学
WordPress大学
博客园 - Franky
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
月光博客
月光博客
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
小众软件
小众软件
Cloudbric
Cloudbric
量子位
N
News and Events Feed by Topic
Vercel News
Vercel News
Security Archives - TechRepublic
Security Archives - TechRepublic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Check Point Blog
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
T
Tenable Blog
S
Secure Thoughts
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cyber Attacks, Cyber Crime and Cyber Security
Stack Overflow Blog
Stack Overflow Blog
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News | PayPal Newsroom
PCI Perspectives
PCI Perspectives
T
Troy Hunt's Blog
GbyAI
GbyAI
Attack and Defense Labs
Attack and Defense Labs
C
Cybersecurity and Infrastructure Security Agency CISA
Y
Y Combinator Blog
美团技术团队
爱范儿
爱范儿
Martin Fowler
Martin Fowler
Last Week in AI
Last Week in AI
P
Privacy International News Feed
T
The Blog of Author Tim Ferriss
F
Full Disclosure

GoodBoyboy 's Blog|惬意小屋-点滴记忆

今天游泳累炸了 回家吵的第一场架 新设计了一个Astro主题 Cap,一个基于PoW的自托管验证码系统 公益服务迁移通知 记忆里的屋子(一) Ubuntu 26.04 Btrfs+LUKS2安装 主域名服务不稳定通知 腾讯元宝客户端实习二面凉经 腾讯元宝客户端实习一面面经 对越来越多AI博文的看法 GoodBoyboy Blog、Talk联动成功 只有失去了才会懂得珍惜,但幸好我还没有失去 滴滴Android客户端一面凉经 GoodBoyboy 's Talk上线! Easy Drop——一个基于Gin开发的高性能、轻量级说说平台 Perfect Pic —— 一个基于 Gin 开发的高性能、轻量级图床 尘封了八年的祝福 欢迎OPPO Pad 4 Pro加入设备大家庭 官方Android11 Box系统的OrangePi 3B新增红外模块教程 家里也换成光纤了qwq 姜还是老的辣 布洛芬效果真不错 再见2025,你好2026 Canokey导入S/MIME邮箱证书并使用Thunderbird发送邮件 1.90$申请 WISeID S/MIME 邮箱证书 新购Intel AX210网卡 OpenPGP邮件加密——关于测试邮件握手的思考 疯狂动物城2太好看了(无具体剧透) 进程调度——时间片轮转 效果是真的好,劲也是真的大 不买立省100% 十月小记 新增外设漫步者G1500bar 欢迎招行万事达加入卡包大家庭 博客十周年啦🎉 ESP32 S3开发小结 ESP32 S3外设小记 Arduino+VSCode开发ESP32-S3 EPS32-S3刷入MicroPython EPS32 S3刷入Picokeys Debian13安装Nvidia驱动 现在小孩都这么早熟么。。。 《动物迷城》二周目通关! Bing索引终于恢复了 家里蹲大学开始招生! 家里蹲大学即将建校,欢迎各位莘莘学子来本校深造(doge 骑车去兜风~ OAuth2授权码、客户端凭证、PKCE、设备码授权流程详解 基于OIDC实现Authentik与阿里云RAM角色的联合身份认证 GitHub release以及Git Commit常用模板 实验室生活 阿里云角色SSO对接authentik进行单点登录 白嫖一年Gemini Pro 突然发现自己可能乳糖不耐受? Android第三方Passkey管理器探索 多线程我太爱你了,你个“大可爱” [公告]现评论区已支持使用emoji表情符号😊 Debian GRUB踩坑记——out of memory 为Debian KDE更换显示字体为思源黑体 Debian补全办公常用字体 Debian12 KDE Edge输入法问题 Debian KDE Plasma 5调整外接显示器亮度 Debian开玩Minecraft Debian KDE使用指纹传感器验证身份
一种基于argon2id算法与shamir算法的内存PoW(工作量证明)解密游戏
GoodBoyboy · 2026-07-07 · via GoodBoyboy 's Blog|惬意小屋-点滴记忆

前言

其实一个月前就设计了这个游戏,今天正式整理发布。

算法采用

通过利用argon2id算法的内存硬度来对抗GPU运算,实现基于内存的PoW,拉低硬件差距。

通过利用shamir算法门限方案,增加游戏乐趣。

游戏整体流程图

flowchart TD
    Enumerate(Enumerate Nonce) --> |枚举 Nonce| Target[Target Nonce]
    M[Memory Cost] --> Parameters[Parameters]
    T[Time Cost] --> Parameters[Parameters]
    Parallelism[Parallelism] -->  Parameters[Parameters]
    Length[Output Length] --> Parameters[Parameters]
    Salt[Salt] --> Parameters[Parameters]
    Parameters[Parameters] --> |参与计算| Argon2id[Argon2id PoW]
    Target[Target Nonce] --> |参与计算| Argon2id[Argon2id PoW]
    Argon2id[Argon2id PoW] --> |派生内容| Secret[Secret]
    Secret[Secret] --> |转换| AES1Key[AES Key]
    AES1Key[AES Key] --> |参与计算| AES1[AES Algorithm]
    EncryptedShamirContent[Encrypted Shamir Key] --> |参与计算| AES1[AES Algorithm]
    AES1[AES Algorithm] --> |解密内容| TagShamirKey[Tag + Shamir Key] 
    TagShamirKey[Tag + Shamir Key] --> |匹配 Tag| CorrectTag{Correct Tag}
    CorrectTag{Correct Tag} --> |No| Enumerate(Enumerate Nonce)
    CorrectTag{Correct Tag} --> |Yes| ShamirKey[Shamir Key]
    ShamirKey[Shamir Key 1] --> |参与计算| Shamir[Shamir Algorithm]
    ShamirKey2[Shamir Key 2] --> |参与计算| Shamir[Shamir Algorithm]
    ShamirKey3[Shamir Key 3] --> |参与计算| Shamir[Shamir Algorithm]
    MoreShamirKey[...] --> |参与计算| Shamir[Shamir Algorithm]
    Shamir[Shamir Algorithm] --> |合成 AES Master Key| MasterAESKey[AES Master Key]
    MasterAESKey[Master AES Key] --> |参与计算| AES2[AES Algorithm]
    EncryptedContent[Encrypted Content] --> |参与计算| AES2[AES Algorithm]
    AES2[AES Algorithm] --> |得到解密密文| DecryptedContent(Decrypted Content)

玩法讲解

公开参数

首先,出题者会给出本次游戏难度(Argon2id算法)参数:

  • Memory Cost(m) - 内存开销:指定算法在计算过程中需要使用的内存总量
  • Time Cost / Iterations (t) - 时间开销 / 迭代次数:指定算法的执行轮数。
  • Parallelism / Lanes (p) - 并发度 / 线程数:指定计算时可以同时使用的独立计算通道(lanes)或线程数量。
  • Salt (S) - 盐值:随机数据。
  • Output Length / Hash Length (l) - 输出长度:最终哈希结果的字节长度,一般为32用于匹配AES256密钥长度

下方为可选的公开数据:

  • Range - Nonce范围:Nonce的范围,可用于降低游戏难度。

然后,出题者会公开本次游戏奖池数与最少碎片数(Shamir算法):

  • Total shares(n) - 总份额数 / 碎片总数:指定总奖池数量。
  • Threshold(k) - 阈值 / 门限值:拼凑出最终Key所需的最少碎片数。

公开密文

接着,出题者会公开本次游戏所有的被加密的密文以及标识:

  • 所有被加密的Shamir Key(奖池)的密文
  • 最终需要解密的密文
  • 正确解密的内容所包含的Tag

开始计算

首先,解题者需要从挑选一个奖池,确定奖池的密文。

然后找出一个Nonce(随机数),将公开的游戏难度参数与Nonce通过argon2id算法进行计算,计算时间由出题者设置的难度决定。

如果出题者公开了Nonce范围,则在范围内寻找。

计算完成后会得到一个派生内容。

接着解题者需要将派生内容转换为 AES Key(具体转换规则由出题者公布),通过AES算法将奖池密文解密出来。

解密出内容后,可以通过Tag进行匹配(其实也可以不用匹配,AES-CGM模式下自带MAC校验),如果能成功匹配,则说明是正确的Nonce,成功得到一枚碎片;如果不能匹配成功,则说明是错误的Nonce,需要重新寻找。

当集齐出题者所设置的最少数量的碎片时,即可通过Shamir算法将碎片合成一个AES Master Key。

最后,通过这个AES Master Key,解密得到最终的奖品。

计算优化

寻找Nonce

如果出题者给出Nonce范围,则可以尝试采用随机+HashMap去重的方式,将一部分期望压在你的lucky上。

你可能计算一次就中,也可能计算完整个奖池才中😄。

当然,你也可以一个一个算。

并行计算

虽然出题者可以限制argon2id算法的并行数,但解题者可以并行的寻找Nonce并计算,只要解题者愿意付出额外的资源与成本😄。

算法讲解

argon2算法

argon2有些复杂,不讲(

Shamir算法

以下内容参考于Gemini

Shamir算法全名叫Shamir 秘密共享算法 (Shamir's Secret Sharing)

Shamir算法的数学基础是多项式插值。

首先构造一个多项式

假设要隐藏的密钥是数值 SS。随机生成一个 m−1m-1 次的多项式:

f(x)=a0+a1x+a2x2+⋯+am−1xm−1f(x) = a_0 + a_1x + a_2x^2 + \dots + a_{m-1}x^{m-1}

在这个多项式中,常数项 a0a_0 为要隐藏的密钥 SS(即 f(0)=Sf(0) = S),而其他的系数 a1,a2,…,am−1a_1, a_2, \dots, a_{m-1} 为随机生成。

然后,在这个多项式的曲线上取 nn 个不同的点 (x1,y1),(x2,y2),…,(xn,yn)(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)

在数学上,要唯一确定一个 m−1m-1 次的多项式,刚好需要 mm 个点。

只要任意 mm 个点,就可以通过拉格朗日插值法计算出完整的原多项式,从而求出 a0a_0,也就是还原出了真正的密钥 SS

如果凑齐点数少于 mm 个,即使拥有 m−1m-1 个点,也无法推导出常数项 a0a_0

示例

例如典型的 (3, 5) 门限方案

门限 m=3m=3,因此需要一个 3−1=23-1=2 次的多项式。

二次多项式也就是一元二次方程,它的图像是一条抛物线 (Parabola)
方程的形式为:

f(x)=a2x2+a1x+Sf(x) = a_2x^2 + a_1x + S

在这条抛物线上,随机切下 5 个不同的点(比如 x=1,2,3,4,5x=1, 2, 3, 4, 5 对应的坐标)。
5 个坐标点 (x1,y1)(x_1, y_1)(x5,y5)(x_5, y_5)

在几何学中,任意三个不在一条直线上的点,可以唯一确定一条抛物线。只要有 3 个坐标点,通过方程计算,就能还原出这条抛物线,找到它与 Y 轴的交点(即 x=0x=0 时的值),即可把 SS 算出来。

如果只有 2 个点,两点只能确定一条直线。经过这两个点的抛物线有无数条,无法知道哪一条是真正的抛物线,SS 的可能性为无限大。

下面为具体数值演示

隐藏的密钥S=42S = 42 (也就是抛物线与 Y 轴交点的值,即 x=0x=0 时的 yy 值)。

方程f(x)=−2x2+5x+42f(x) = -2x^2 + 5x + 42 (对还原者隐藏)。

生成的 5 个坐标点

  1. (1,45)(1, 45)
  2. (2,44)(2, 44)
  3. (3,39)(3, 39)
  4. (4,30)(4, 30)
  5. (5,17)(5, 17)

假设已知的坐标分别是 (1,45)(1, 45)(3,39)(3, 39)(4,30)(4, 30)

拉格朗日插值法 (Lagrange Interpolation)

拉格朗日插值法的核心思想是“加权”。对于每一个点的 yy 值,乘以一个特定的“权重系数”(通常用 ll 表示),然后相加即可得到 x=0x=0 时的密钥 SS

公式如下:

S=y1⋅l1+y2⋅l2+y3⋅l3S = y_1 \cdot l_1 + y_2 \cdot l_2 + y_3 \cdot l_3

权重 ll 它只和的 xx 坐标 有关。

计算规则是:用其他的 xx 坐标除以“其他的 xx 坐标减去自己的 xx 坐标”,然后相乘。

把选出的三个点的 xx 坐标分别记为:x1=1x_1=1x2=3x_2=3x3=4x_3=4

计算 (1,45)(1, 45) 的权重 l1l_1 提取另外两个的 xx 坐标(3344),与 xx 坐标(11)进行计算:

l1=x2x2−x1⋅x3x3−x1l_1 = \frac{x_2}{x_2 - x_1} \cdot \frac{x_3}{x_3 - x_1}

l1=33−1⋅44−1=32⋅43=126=2l_1 = \frac{3}{3 - 1} \cdot \frac{4}{4 - 1} = \frac{3}{2} \cdot \frac{4}{3} = \frac{12}{6} = 2

计算 (3,39)(3, 39) 的权重 l2l_2 提取另外两个的 xx 坐标(1144),与 xx 坐标(33)进行计算:

l2=x1x1−x2⋅x3x3−x2l_2 = \frac{x_1}{x_1 - x_2} \cdot \frac{x_3}{x_3 - x_2}

l2=11−3⋅44−3=1−2⋅41=−2l_2 = \frac{1}{1 - 3} \cdot \frac{4}{4 - 3} = \frac{1}{-2} \cdot \frac{4}{1} = -2

计算 (4,30)(4, 30) 的权重 l3l_3 提取另外两个的 xx 坐标(1133),与 xx 坐标(44)进行计算:

l3=x1x1−x3⋅x2x2−x3l_3 = \frac{x_1}{x_1 - x_3} \cdot \frac{x_2}{x_2 - x_3}

l3=11−4⋅33−4=1−3⋅3−1=33=1l_3 = \frac{1}{1 - 4} \cdot \frac{3}{3 - 4} = \frac{1}{-3} \cdot \frac{3}{-1} = \frac{3}{3} = 1

现在,将三个点的 yy 值与各自算出的权重相乘,然后相加:

S=(y1⋅l1)+(y2⋅l2)+(y3⋅l3)S = (y_1 \cdot l_1) + (y_2 \cdot l_2) + (y_3 \cdot l_3)

S=(45⋅2)+(39⋅−2)+(30⋅1)S = (45 \cdot 2) + (39 \cdot -2) + (30 \cdot 1)

S=90−78+30S = 90 - 78 + 30

S=42S = 42

最后还原出了最初设定的密钥 42

原始的解方程

依然使用上文 3 个坐标点:(1,45)(1, 45)(3,39)(3, 39)(4,30)(4, 30)

3 个点确定的抛物线,它的标准方程形式则为:

y=ax2+bx+cy = ax^2 + bx + c

目标是求出未知的系数 aabbcc

注意:x=0x = 0 时,y=cy = c。因此,因此需要寻找的 SS 其实就是常数项 cc

将 3 个 (x,y)(x, y) 坐标分别代入标准方程中:

  1. 代入点 (1,45)(1, 45)

a(1)2+b(1)+c=45a(1)^2 + b(1) + c = 45

化简得:a+b+c=45a + b + c = 45 (方程 ①)

  1. 代入点 (3,39)(3, 39)

a(3)2+b(3)+c=39a(3)^2 + b(3) + c = 39

化简得:9a+3b+c=399a + 3b + c = 39 (方程 ②)

  1. 代入点 (4,30)(4, 30)

a(4)2+b(4)+c=30a(4)^2 + b(4) + c = 30

化简得:16a+4b+c=3016a + 4b + c = 30 (方程 ③)

现在,得到了一个包含三个未知数 (a,b,ca, b, c) 的三元一次方程组。

为了解开它,可以通过两个方程相减,先消去常数项 cc

1. 用方程 ② 减去方程 ①:

(9a+3b+c)−(a+b+c)=39−45(9a + 3b + c) - (a + b + c) = 39 - 45

8a+2b=−68a + 2b = -6

两边同除以 2,化简得:4a+b=−34a + b = -3 (方程 ④)

2. 用方程 ③ 减去方程 ②:

(16a+4b+c)−(9a+3b+c)=30−39(16a + 4b + c) - (9a + 3b + c) = 30 - 39

7a+b=−97a + b = -9 (方程 ⑤)

3. 用方程 ⑤ 减去方程 ④,消去 bb

(7a+b)−(4a+b)=−9−(−3)(7a + b) - (4a + b) = -9 - (-3)

3a=−63a = -6

解得:a=−2a = -2

4. 把 a=−2a = -2 代回方程 ④,求 bb

4(−2)+b=−34(-2) + b = -3

−8+b=−3-8 + b = -3

解得:b=5b = 5

现在已知 a=−2a = -2b=5b = 5。将其代入方程 ① 中:

a+b+c=45a + b + c = 45

−2+5+c=45-2 + 5 + c = 45

3+c=453 + c = 45

解得:c=42c = 42

后记

其实这个游戏不仅可以用argon2id算法,也可以用RSW时间锁谜题这类算法。