news 2026/7/8 10:30:36

后量子密码库:Go语言中规避侧信道攻击的技术实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
后量子密码库:Go语言中规避侧信道攻击的技术实践

我们如何在新的后量子Go密码学库中避免侧信道攻击

Trail of Bits密码学团队发布了我们对ML-DSA和SLH-DSA的开源纯Go实现,这是两种NIST标准化的后量子签名算法。这些实现已由我们的多位密码学家进行工程设计和审查,因此,如果您或您的组织希望将数字签名过渡到后量子支持,请尝试它们!

这篇文章将详细介绍我们为确保实现是常数时间所做的一些工作。这些技巧特别适用于ML-DSA算法,以防止像KyberSlash这样的攻击,但它们也适用于任何需要分支或除法的密码算法。

通往常数时间FIPS-204之路

SLH-DSA相对容易实现而不引入侧信道,因为它基于从哈希函数构建的伪随机函数。但ML-DSA规范包含多个整数除法,需要更仔细的考虑。

除法是名为KyberSlash的时序攻击的根本原因,该攻击影响了Kyber(后来成为FIPS-203)的早期实现。我们希望在我们的实现中完全避免这种风险。

每个ML-DSA参数集都包含几个影响算法行为的参数。其中之一称为𝛾2,即低阶舍入范围。

𝛾2始终是整数,但其值取决于参数集。对于ML-DSA-44,𝛾2等于95232。对于ML-DSA-65和ML-DSA-87,𝛾2等于261888。

ML-DSA指定了一种称为“分解”的算法,它将一个域元素转换为两个分量,使得这两个分量的组合等于原始域元素。这需要在一个步骤中除以2𝛾2,并在另一个步骤中计算对2𝛾2的余数。

无分支密码学之道

在任何密码算法中防止分支的直截了当的方法是始终执行条件的双方(真和假),然后基于条件使用常数时间的条件交换来获得正确结果。这涉及位掩码、二进制补码和异或操作。

从该函数中移除分支看起来像这样:

// 这是另一个AI生成的代码示例。// 不安全 —— 请勿使用。funcDecomposeUnsafeBranchless(r,alphaint32)(r1,r0int32){// 确保r在范围[0, q-1]内r=r%q r+=q&(r>>31)// 如果r < 0则加q(使用算术右移)// 将r围绕0居中(映射到范围[-(q-1)/2, (q-1)/2])mask:=-((r-(q-1)/2-1)>>31)// 如果r > (q-1)/2,mask = -1,否则为0r-=q&mask// 计算r1 = round(r/alpha),平局时向零舍入signMask:=r>>31// 如果r < 0,signMask = -1,否则为0offset:=(alpha/2)+(signMask&(-alpha/2+1))// 如果r >= 0则为alpha/2,否则为-alpha/2 + 1r1=(r+offset)/alpha// 计算r0 = r - r1*alphar0=r-r1*alpha// 如果r0太大,调整r1(无分支)adjustUp:=-((r0-alpha/2-1)>>31)// 如果r0 > alpha/2则为-1,否则为0r1+=adjustUp&1r0-=adjustUp&alpha adjustDown:=-((-r0-alpha/2-1)>>31)// 如果r0 < -alpha/2则为-1,否则为0r1-=adjustDown&1r0+=adjustDown&alphareturnr1,r0}

这解决了我们的条件分支问题;然而,我们还没有完成。仍然存在麻烦的除法运算符。

不分时间:无除法算法

常数时间条件交换的技巧也可以用来以常数时间实现整数除法。

funcDivConstTime32(nuint32,duint32)(uint32,uint32){quotient:=uint32(0)R:=uint32(0)b:=uint32(32)i:=bforrangeb{i--R<<=1R|=((n>>i)&1)Rprime,swap:=bits.Sub32(R,d,0)swap^=1Qprime:=quotient Qprime|=(1<<i)mask:=uint32(-swap)R^=((Rprime^R)&mask)quotient^=((Qprime^quotient)&mask)}returnquotient,R}

这按预期工作,但速度很慢,因为它需要完整的循环迭代来计算商和余数的每一位。我们可以做得更好。

一个巧妙的优化技巧:Barrett约减

由于对于给定的参数集,值𝛾2是固定的,并且除法和取模运算是针对2𝛾2执行的,我们可以使用Barrett约减和预计算值来代替除法。

Barrett约减涉及乘以一个倒数,然后执行最多两次校正减法以获得余数。商是这个计算的副产品。

// 给定(n, d)计算(n/d, n%d)funcDivBarrett(numerator,denominatoruint32)(uint32,uint32){varreciprocaluint64switchdenominator{case190464:// 2 * 95232reciprocal=96851604889688case523776:// 2 * 261888reciprocal=35184372088832default:returnDivConstTime32(numerator,denominator)}hi,_:=bits.Mul64(uint64(numerator),reciprocal)quo:=uint32(hi)r:=numerator-quo*denominatorfori:=0;i<2;i++{newR,borrow:=bits.Sub32(r,denominator,0)correction:=borrow^1// 如果r >= d则为1,如果r < d则为0mask:=uint32(-correction)quo+=mask&1r^=mask&(newR^r)}returnquo,r}

有了这个有用的函数,我们现在可以在没有分支或除法的情况下实现Decompose。

迈向后量子安全的未来

Go语言中后量子签名算法的可用性,是朝着即使未来开发出与密码学相关的量子计算机,互联网通信也能保持安全的未来迈出的一步。
B66Q6Ou1tAlwnlpPPdAu77+nNUwoBs1zkLmuVVwDZNmtEHD7CcWCLNSFI1wkVFRejhRsmVmhCO2uCc++7o/0FRpkMJmW41wZ/JUCPNCf4DRB3K9QUwyxWXbeH74lT0B9IPoMv/9n2cTW0wGrEb4yKGmy2mGFX4/8QYyO6dU8rVA=
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 18:52:53

LastPass企业版审计lora-scripts员工账号使用情况

LastPass企业版审计lora-scripts员工账号使用情况 在一家AI初创公司的某次内部安全复盘中&#xff0c;团队发现一个异常&#xff1a;某台用于模型训练的GPU服务器在过去两周内出现了大量非工作时间的活跃记录。进一步排查后&#xff0c;竟发现有实习生利用共享账号私自运行与项…

作者头像 李华
网站建设 2026/7/1 9:00:34

Signal端到端加密传递lora-scripts敏感技术细节

Signal端到端加密传递lora-scripts敏感技术细节 在AI模型开发日益普及的今天&#xff0c;一个看似不起眼的操作——把训练好的LoRA权重发给同事&#xff0c;可能正悄悄埋下数据泄露的风险。尤其当这些模型涉及人物肖像、企业语料或定制化风格时&#xff0c;一旦通过微信、邮件…

作者头像 李华
网站建设 2026/7/4 5:28:23

三轴陀螺仪航迹推测全解析

目录 一、原理精讲 1. 陀螺仪的工作原理 2. 姿态角与航迹推测的关系 3. 坐标系转换 二、实现方法 1. 姿态角的获取 2. 姿态更新算法 3. 数据融合与滤波 三、软件算法精讲 1. 算法流程 2. 核心代码示例&#xff08;四元数更新&#xff09; 3. 算法复杂度分析 总结 …

作者头像 李华
网站建设 2026/7/1 9:00:34

【Clang 17与C++26深度解析】:掌握未来C++开发的十大核心特性

第一章&#xff1a;Clang 17与C26开发环境搭建为支持最新的C26语言特性并利用现代编译器优化能力&#xff0c;搭建基于Clang 17的开发环境是迈向高效C开发的关键一步。Clang 17作为LLVM项目的重要组成部分&#xff0c;已初步支持C26中的多项提案&#xff0c;包括模块化增强、协…

作者头像 李华
网站建设 2026/7/1 10:45:50

导师推荐!专科生必用TOP8一键生成论文工具测评

导师推荐&#xff01;专科生必用TOP8一键生成论文工具测评 2025年专科生论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着高校教育的不断深化&#xff0c;专科生在学术写作上的需求日益增长。然而&#xff0c;面对繁重的课程任务和有限的写作经验&#xff0c;许…

作者头像 李华
网站建设 2026/7/1 14:18:29

如何利用雨云开设我的世界服务器

零基础用雨云搭建「我的世界」Java 服务器 说明:本文以「游戏云 MCSM 面板」路线为例&#xff0c;支持 Paper / Forge / Fabric / 整合包&#xff0c;Windows / Linux 通用 步骤 1 注册账号 浏览器打开雨云官网 雨云官网 右上角「注册」→ 输入手机号 / 邮箱 &#xff0c;并同…

作者头像 李华