一种基于argon2id算法与shamir算法的内存PoW(工作量证明)解密游戏
前言
其实一个月前就设计了这个游戏,今天正式整理发布。
算法采用
通过利用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算法的数学基础是多项式插值。
首先构造一个多项式
假设要隐藏的密钥是数值 。随机生成一个 次的多项式:
在这个多项式中,常数项 为要隐藏的密钥 (即 ),而其他的系数 为随机生成。
然后,在这个多项式的曲线上取 个不同的点 。
在数学上,要唯一确定一个 次的多项式,刚好需要 个点。
只要任意 个点,就可以通过拉格朗日插值法计算出完整的原多项式,从而求出 ,也就是还原出了真正的密钥 。
如果凑齐点数少于 个,即使拥有 个点,也无法推导出常数项 。
示例
例如典型的 (3, 5) 门限方案
门限 ,因此需要一个 次的多项式。
二次多项式也就是一元二次方程,它的图像是一条抛物线 (Parabola)。
方程的形式为:
在这条抛物线上,随机切下 5 个不同的点(比如 对应的坐标)。
5 个坐标点 到 。
在几何学中,任意三个不在一条直线上的点,可以唯一确定一条抛物线。只要有 3 个坐标点,通过方程计算,就能还原出这条抛物线,找到它与 Y 轴的交点(即 时的值),即可把 算出来。
如果只有 2 个点,两点只能确定一条直线。经过这两个点的抛物线有无数条,无法知道哪一条是真正的抛物线, 的可能性为无限大。
下面为具体数值演示
隐藏的密钥: (也就是抛物线与 Y 轴交点的值,即 时的 值)。
方程: (对还原者隐藏)。
生成的 5 个坐标点:
假设已知的坐标分别是 、 和
拉格朗日插值法 (Lagrange Interpolation)
拉格朗日插值法的核心思想是“加权”。对于每一个点的 值,乘以一个特定的“权重系数”(通常用 表示),然后相加即可得到 时的密钥 。
公式如下:
权重 它只和的 坐标 有关。
计算规则是:用其他的 坐标除以“其他的 坐标减去自己的 坐标”,然后相乘。
把选出的三个点的 坐标分别记为:,,。
计算 的权重 : 提取另外两个的 坐标( 和 ),与 坐标()进行计算:
计算 的权重 : 提取另外两个的 坐标( 和 ),与 坐标()进行计算:
计算 的权重 : 提取另外两个的 坐标( 和 ),与 坐标()进行计算:
现在,将三个点的 值与各自算出的权重相乘,然后相加:
最后还原出了最初设定的密钥 42。
原始的解方程
依然使用上文 3 个坐标点:、 和 。
3 个点确定的抛物线,它的标准方程形式则为:
目标是求出未知的系数 、 和 。
注意: 当 时,。因此,因此需要寻找的 其实就是常数项 。
将 3 个 坐标分别代入标准方程中:
- 代入点 :
化简得: (方程 ①)
- 代入点 :
化简得: (方程 ②)
- 代入点 :
化简得: (方程 ③)
现在,得到了一个包含三个未知数 () 的三元一次方程组。
为了解开它,可以通过两个方程相减,先消去常数项 :
1. 用方程 ② 减去方程 ①:
两边同除以 2,化简得: (方程 ④)
2. 用方程 ③ 减去方程 ②:
(方程 ⑤)
3. 用方程 ⑤ 减去方程 ④,消去 :
解得:
4. 把 代回方程 ④,求 :
解得:
现在已知 和 。将其代入方程 ① 中:
解得:
后记
其实这个游戏不仅可以用argon2id算法,也可以用RSW时间锁谜题这类算法。
Use this card to join MyBlog and participate in a pleasant discussion together .
Welcome to GoodBoyboy 's Blog,wish you a nice day .


