码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 有限域的Fast Multiplication和Modular Reduction算法实现


    1. 引言

    关于有限域的基础知识,可参考:

    • RISC Zero团队2022年11月视频 Intro to Finite Fields: RISC Zero Study Club
      在这里插入图片描述

    有限域几乎是密码学中所有数学的基础。
    ZKP证明系统中的所有运算都是基于有限域的:

    • 使用布尔运算的数字电路:如AND、OR、NOT。
    • 使用有限域运算的算术电路:如addition、multiplication、negation。

    但是,真实的计算机没有有限域电路装置,只有:

    • ADD rax, rbx
    • MUL rax
    • SHR rax, CL
    • 等等

    因此,需基于以上运算来构建有限域运算。
    有限域运算的速度很关键,原因在于:

    • 影响ZKP可用性的最大障碍在于证明开销。
    • 几乎所有的证明时间都用于有限域运算了。为提升ZKP证明速度:
      • 减少有限域运算次数(如,更高效的NTT或MSM算法)
      • 让有限域运算更高效(如,使用优化的有限域表示)

    本文主要关注内容有:

    • BigInts
    • BigInts经典加法运算
    • BigInts经典乘法运算
    • Modular reduction(Barrett算法):当无法更改数字表示时,最有用。
    • Montgomery form
    • Multiplication and reduction(Montgomery算法):最常用算法。
    • 其它multiplication算法

    并对大整数乘法运算的经典算法、Barrett算法、Montgomery算法进行了对比:
    在这里插入图片描述

    2. 大整数及其加法和乘法运算

    大整数,又名BigInt或Multiprecision Integers。
    真实计算机的运算符是基于word的:

    • 几乎所有的现代计算机都使用64-bit words
    • 但32-bit words并未完全过时。比如在IoT世界。

    对于更大(如256位)的域,会将其切分为words来表示:

    • 如,通常以4个64-bit word来表示256-bit数字。
    • 如十进制的8位数字,可 以4个2-digit word来表示。

    如以100进制的digit来表示大整数27311837,对应为:
    ( 27   31   18   37 ) 100 (27\ 31\ 18\ 37)_{100} (27 31 18 37)100​。

    2.1 大整数经典加法运算

    对应的大整数加法运算,如 ( 27   31   18   37 ) 100 + ( 88   68   97   89 ) 100 (27\ 31\ 18\ 37)_{100} + (88\ 68\ 97\ 89)_{100} (27 31 18 37)100​+(88 68 97 89)100​,计算规则为:
    在这里插入图片描述
    具体见Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.3算法:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.2 大整数经典乘法运算

    以 ( 54   12 ) 100 ∗ ( 36   29 ) 100 (54\ 12)_{100}*(36\ 29)_{100} (54 12)100​∗(36 29)100​大整数乘法运算为例,具体见Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.8算法:
    在这里插入图片描述
    对应各个step的计算数据为:
    在这里插入图片描述

    3. Modular Reduction

    需注意,以上加法和乘法运算结果均为更大的值,需将这些大的结果值reduce为相应的canonical表示,如:
    在这里插入图片描述
    常见的Modular Reduction算法有:

    • 1)Barret reduction算法:当无法更改数字表示时,最有用。
    • 2)Montgomery multiplication and reduction算法:最常用算法。

    相关博客有:

    • 基础算法优化——Fast Modular Multiplication
    • GPU/CPU友好的模乘算法:Multi-Precision Fast Modular Multiplication
    • Montgomery reduction——多精度模乘法运算算法

    3.1 Barret reduction算法

    做reduction最明显的方式是做除法,但除法运算昂贵,且可能不是constant time的。以single-word除法运算 b = 1 , R = 2 k b=1,R=2^k b=1,R=2k 为例:

    func reduce(a uint) uint {
        q:= a / n  // Division implicitly returns the floor of the result.
        return a - q * n
    }
    
    • 1
    • 2
    • 3
    • 4

    非constant time会存在timing attack攻击问题。
    Barrett reduction为将 1 / n 1/n 1/n近似为 m / 2 k m/2^k m/2k,因为 m / 2 k m/2^k m/2k中的除法实际是右移运算,要便宜得多。【可近似计算 m m m值为 m = ⌊ 2 k / n ⌋ m=\left \lfloor 2^k/n\right \rfloor m=⌊2k/n⌋】

    func reduce(a uint) uint {
        q := (a * m) >> k // ">> k" denotes bitshift by k.
        return a - q * n
    }
    
    • 1
    • 2
    • 3
    • 4

    不过这样reduce之后的结果在 [ 0 , 2 n ) [0,2n) [0,2n),而不是 [ 0 , n ) [0,n) [0,n),因此需进一步reduce:

    func reduce(a uint) uint {
        q := (a * m) >> k
        a -= q * n
        if a >= n {
            a -= n
        }
        return a
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.17算法,将其扩展为了multi-word Barrett Reduction算法,且在以上最后一步reduce之前的结果不再是 [ 0 , 2 n ) [0,2n) [0,2n)而是可能更大的范围值,因此在Algorithm 10.17算法中第4步采用的是while:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.2 Montgomery multiplication and reduction算法

    Montgomery Form为另一种有限域表示,其支持快速combined multiplication and reduction算法。

    之前将有限域元素表示为:
    x ∈ [ 0 , N − 1 ] x\in [0,N-1] x∈[0,N−1]

    而Montgomery Form表示定义为:
    [ x ] = ( x R ) m o d    N [x]=(xR)\mod N [x]=(xR)modN

    Montgomery Reduction算法计算的是:
    R E D C ( u ) = ( u R − 1 ) m o d    N REDC(u)=(uR^{-1})\mod N REDC(u)=(uR−1)modN
    而不是之前Barrett Reduction计算的 u m o d    N u\mod N umodN。

    R E D C REDC REDC是一个非常多功能的公式:

    • 1)将经典转换为Montgomery: [ x ] = R E D C ( ( x R 2 ) m o d    N ) [x]=REDC((xR^2)\mod N) [x]=REDC((xR2)modN)
    • 2)将Montgomery转换为经典: R E D C ( [ x ] ) = x REDC([x])=x REDC([x])=x
    • 3)对Montgomery Form表示的乘法运算: ( ( x R m o d    N ) ∗ ( y R m o d    N ) ∗ R − 1 m o d    N ) = ( x y R ) m o d    N ((xR\mod N)*(yR\mod N)*R^{-1}\mod N)=(xyR)\mod N ((xRmodN)∗(yRmodN)∗R−1modN)=(xyR)modN,对应在Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 11.3算法中做了相应实现:
      在这里插入图片描述

    其中 Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.22算法中所实现的Montgomery reduction算法为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4. 其它multiplication算法

    Multiplication算法的演变过程为:

    • multiplication算法曾被认为其runtime约为 O ( n 2 ) O(n^2) O(n2)。
    • Karatsuba发明了一种divide-and-conquer算法,其runtime为 O ( n 1.58 ) O(n^{1.58}) O(n1.58)。
    • Toom-Cook乘法算法与Karatsuba算法类似,性能略好一点。
    • Schönhage–Strassen 发明了一种NTT算法,其runtime为 O ( n ⋅ log ⁡ n ⋅ log ⁡ log ⁡ n ) O(n\cdot \log n\cdot \log\log n) O(n⋅logn⋅loglogn)。
    • 当对大整数做乘法运算时,其速度要更慢,如4096位RSA密钥。

    参考资料

    [1] RISC Zero团队2023年2月视频 Finite Field Implementations: Barrett & Montgomery【slide见Finite Field Implementations】
    [2] 维基百科Barrett reduction

    RISC Zero系列博客

    • RISC0:Towards a Unified Compilation Framework for Zero Knowledge
    • Risc Zero ZKVM:zk-STARKs + RISC-V
    • 2023年 ZK Hack以及ZK Summit 亮点记
    • RISC Zero zkVM 白皮书
    • Risc0:使用Continunations来证明任意EVM交易
    • Zeth:首个Type 0 zkEVM
    • RISC Zero项目简介
    • RISC Zero zkVM性能指标
    • Continuations:扩展RISC Zero zkVM支持(无限)大计算
    • A summary on the FRI low degree test前2页导读
    • Reed-Solomon Codes及其与RISC Zero zkVM的关系
    • RISC Zero zkVM架构
    • RISC-V与RISC Zero zkVM的关系
  • 相关阅读:
    vue3的单组件的编写(三)【响应式 API 之 toRef 与 toRefs】
    支付宝支付模块开发
    区间映射算法
    C语言经典例题-11
    ESP32网络编程-TCP客户端数据传输
    Matplotlib 是一个广泛用于 Python 数据可视化的库
    FoveaBox:细节差别,另一种DenseBox+FPN的Anchor-free方案 | IEEE TIP 2020
    [数据结构]二叉树的链式结构
    信息学奥赛一本通(c++):1118:铺地毯
    Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器
  • 原文地址:https://blog.csdn.net/mutourend/article/details/134224122
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号