在古老的书法江湖里,每一位大师都拥有一枚独一无二的天工印。大师完成字画后,总要蘸上朱砂印泥,在作品的角落重重一盖——这一盖,等于向天下宣告:此作出自吾手,不许篡改。收藏家拿到字画,会翻开大师公开出版的《印谱》,对照印章的每一道纹路。纹路完全吻合,便安心收藏;有半点出入,便知是赝品。大师想赖账也赖不掉,因为印章特征就摆在印谱上。这就是数字签名最朴素的雏形:一印(私钥)盖下,万人(公钥)可验。本文就带你从这枚印章出发,层层揭开数字签名的数学内核、算法家族、安全边界与信任体系。

岗位关联

掌握数字签名,是理解 HTTPS、区块链、电子合同乃至 AI 模型发布安全的第一步。对于 AI 从业者而言,这不仅是密码学的基石,更是构建可信、可审计的智能系统不可或缺的工程素养。

目录
  1. 可视化演示
  2. 签名概述:一枚印章的江湖规矩
  3. 非对称密码基础:印谱公开,天工印唯一
  4. RSA签名方案:先写提要,再盖大印
  5. DSA签名算法:随机领舞者的舞步
  6. ECDSA椭圆曲线签名:微型印章的舞台
  7. 安全边界与盲签名:蒙眼的印章
  8. PKI公钥基础设施:谁为印谱背书
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

数字签名利用非对称密码实现身份认证与不可否认性,签名者用私钥签名验证者用公钥验证。本文详解RSA签名方案、DS... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

数字签名基本:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

签名概述:一枚印章的江湖规矩

每一位书法大师都有一枚独有的天工印。字画完成后,大师蘸上印泥重重一盖,等于向天下宣告此作出自吾手。收藏家拿出大师公开出版的《印谱》,照章比对,纹路吻合便收,有出入便弃。这套仪式的核心非同寻常:印章藏在私处(私钥),印谱公开流传(公钥),人人都可验证,却只有大师能盖。于是“谁写的、改没改、赖不赖得掉”三个问题一并解决。

数字签名就是这套仪式在比特世界的复刻。与加密不同,签名的目的不是让内容变成天书,而是让任何人都能验证“这是谁写的、有没有被改过”。一个完整的方案有三件事物:密钥生成、签名、验证。打个比方,密钥生成是铸造天工印和刊印印谱,签名是蘸墨盖章,验证是比照印谱确认真伪。它还给不了机密性——就像印章不负责替字画保密一样。

形式化地看,数字签名是三个算法的组合,分别完成“造印”“盖印”“验印”:

这套体系最动人的地方在于:天工印的纹理难仿,盖下的印迹难赖。数字签名的三大核心性质——身份认证、数据完整、不可否认——正是印章江湖的规矩在密码学世界的翻版。后面我们将逐一拆解,看这些“印迹”究竟如何从数学中诞生。

KeyGen(1k)→(sk,pk);Sign(sk,m)→σ;Verify(pk,m,σ)→{0,1}\mathrm{KeyGen}(1^k) \to (sk, pk); \quad \mathrm{Sign}(sk, m) \to \sigma; \quad \mathrm{Verify}(pk, m, \sigma) \to \{0, 1\}
  1. 密钥生成输入安全参数,输出一对钥匙:私钥sk留作签名,公钥pk公开验证
    (sk,pk)(sk, pk)
  2. 签名算法签名者持私钥sk,对消息m生成签名σ
    σ←Sign(sk,m)\sigma \leftarrow \mathrm{Sign}(sk, m)
  3. 验证算法验证者用公钥pk检查σ是否为合法签名,合法输出1,否则输出0
    Verify(pk,m,σ)=1\mathrm{Verify}(pk, m, \sigma) = 1

非对称密码基础:印谱公开,天工印唯一

大师的印为什么仿不了?因为印料是块天外陨石,纹路千回百转;而印谱却人人可得。这种“印章藏私、印谱公开”的设计,正是非对称密码的灵魂。它把密钥拆成两半:公钥可以贴满大街,私钥只能烂在怀里。用公钥加密,只有私钥能解;用私钥签名,只有公钥能验。方向和用途截然相反。

最常见的非对称体系是RSA。它建立在一个朴素的算术事实上:把两个大素数乘起来容易,把乘积再拆回原素因却极其困难。这把“难拆的乘法锁”就是单向陷门函数——正向一秒钟,反向一万年。实际使用时,密钥生成的工序像铸印一样讲究:先选两个大素数p和q,相乘得模数n;再算欧拉函数φ(n);随后挑一个公开指数e,解出它的逆元d。

用公式描述这把“锁”的铸造过程:

p和q就像铸造天工印的原始矿石,铸成之后必须焚毁矿脉,否则别人顺着矿脉反推出n的分解,就能仿出另一枚私印。n是印章上人尽皆知的轮廓,e是验章的标尺,d是只有大师知道的暗槽——有了暗槽才能压出印,没有暗槽,抢走n和e也白搭。正是这种“公开一切却不泄露私钥”的不对称,撑起了整个数字签名的舞台。

n=p×q,ϕ(n)=(p−1)×(q−1),d≡e−1(modϕ(n))n = p \times q, \quad \phi(n) = (p-1) \times (q-1), \quad d \equiv e^{-1} \pmod{\phi(n)}
  1. 模数乘积两个大素数相乘得到模数n,n是公钥的一部分,也是“锁的轮廓”
    n=p×qn = p \times q
  2. 欧拉函数计算与n互质的数的个数,它揭示锁芯的复杂度
    ϕ(n)=(p−1)×(q−1)\phi(n) = (p-1) \times (q-1)
  3. 求乘法逆元d是e在模φ(n)下的逆元,满足e乘以d再除以φ(n)余1,d就是私钥的“暗槽”
    d≡e−1(modϕ(n))d \equiv e^{-1} \pmod{\phi(n)}

RSA签名方案:先写提要,再盖大印

字画太长,印章盖不下整幅作品怎么办?大师的做法很聪明:先将画的内容“浓缩”成一页提要,再在提要上盖章。验证的人拿到画,也先浓缩成提要,再比印章和提要是否默契——提要变了,章就对不上。这一招既省了印泥,又让任何一处的细微篡改都无处遁形。RSA签名正是这个套路。

经典步骤是:先对消息m做哈希,得到固定长度的摘要h;再用私钥d对h做模幂运算,得到签名s。验证方用公钥e从s中恢复出h′,并重新计算消息的哈希,两者一致则通过。签名只对摘要运算,不碰原文,所以速度飞快;安全性则由哈希的单向性兜底——想伪造签名,必须同时攻破哈希和模幂两关。

值得一提的是,直接在消息上做模幂的“教科书RSA”并不安全,必须引入哈希和PSS填充,才能阻断乘法同态伪造。完整流程如下:

这就像大师把画浓缩成一行行诗写在扇面背后,再盖上私印。藏家拿到扇面,先默写一遍诗,再用印谱照印泥——诗对得上、印也对得上,那便是真迹。若有人偷改诗中一字,印迹立刻与提要失配。RSA签名在HTTPS证书、软件更新、电子合同里无处不在,全都依赖这套“先凝练、后盖章”的默契。

s=(H(m))d mod n,h′=se mod n,h′=?H(m)s = (H(m))^d \bmod n, \quad h' = s^e \bmod n, \quad h' \stackrel{?}{=} H(m)
  1. 摘要计算用SHA-256等哈希函数把任意长消息压成固定长摘要h
    h=H(m)h = H(m)
  2. 私钥模幂对摘要做d次幂并取模n,得到签名s,相当于蘸印盖下
    s=hd mod ns = h^d \bmod n
  3. 公钥恢复验证方对s做e次幂取模,恢复出摘要h′,相当于把印泥照进印谱
    h′=se mod nh' = s^e \bmod n
  4. 比对结论h′与本地计算的哈希一致,则接受签名
    h′=H(m)⇒签名有效h' = H(m) \Rightarrow \text{签名有效}

DSA签名算法:随机领舞者的舞步

RSA有个隐患:它的数学结构太直白——签名的乘积可以凑出新的签名,就像两个印章叠盖能拼出第三枚印章,这叫同态性。为了绕开这种“印泥叠加”的攻击,NIST设计了DSA。它不直接对内容做模幂,而是让每一次签名都邀请一位“随机领舞者”k上场。k每次都在变,于是同样的内容,两次签出的印迹也完全不同。

DSA基于离散对数难题:已知生成元g、模数p,给你y等于g的x次方,想反推私钥x极其困难。签名时,签名者先让随机数k跳出一段舞步r,再把摘要、私钥x和r揉成第二段舞步s。验证方从公钥y出发,重新编排这两段舞步,比对是否还原出r。由于k只出现一次,攻击者无法从两个签名中拼凑出私钥信息。

签名两步走的数学表达如下:

验证时用公钥y和参数重建舞步v,并与r比对:

随机领舞者k若被重用,等于两场舞用了同一个“意外动作”,旁观者立刻能算出大师的私密舞步——私钥当场裸奔。所以DSA的铁律是:k必须一次性、机密、随机,如同舞者每次都要换一顶崭新的假面。正因如此,DSA在政府与金融系统中被长期使用,它的随机数生成器甚至单独做成硬件,以免领舞者“偷懒”。

r=(gk mod p) mod q,s=k−1(H(m)+x⋅r) mod qr = (g^k \bmod p) \bmod q, \quad s = k^{-1}(H(m) + x \cdot r) \bmod q
v=(gu1⋅yu2 mod p) mod q,v=?rv = (g^{u_1} \cdot y^{u_2} \bmod p) \bmod q, \quad v \stackrel{?}{=} r
  1. 临时随机数每次签名生成新鲜随机数k,作为领舞者,绝不可重用
    k∈RZq∗k \in_R \mathbb{Z}_q^*
  2. 第一段签名r由g的k次方先对p取模、再对q取模得到,它是签名的“前半句”
    r=(gk mod p) mod qr = (g^k \bmod p) \bmod q
  3. 第二段签名用k的逆元、摘要、私钥x和r共同计算s,它是签名的“后半句”
    s=k−1(H(m)+x⋅r) mod qs = k^{-1}(H(m) + x \cdot r) \bmod q
  4. 验证恢复由公开参数和公钥重建v,v等于r则签名有效
    v=(gu1⋅yu2 mod p) mod qv = (g^{u_1} \cdot y^{u_2} \bmod p) \bmod q

ECDSA椭圆曲线签名:微型印章的舞台

DSA的印章太大了,参数动辄2048位,塞不进手机和智能卡。于是密码学家把舞台搬到了一条椭圆曲线上:y²等于x³加ax加b。曲线上的点像珠子一样串成一条链,可以做加法、做标量乘法,却极难做“除法”——知道Q和G,反求k倍关系中的k,就是椭圆曲线离散对数难题。同样的安全强度,密钥只要256位,大印缩成了微型印章。

椭圆曲线上的“乘法”约定为标量乘法:Q等于d乘以G,其中G是公开基点,d是私钥,Q是公钥。ECDSA的签名套路与DSA神似,只是把“g的k次方取模”换成了“k乘以基点G”。比特币、以太坊、TLS证书,到处都能见到这个微型印章的身影——一笔交易几百字节,却守护着数十亿美元的资产。

签名与验签的完整流程浓缩为两个公式:

微型印章的好处立竿见影:256位密钥即可抵挡暴力穷举,签名速度极快,特别适合资源受限的物联网设备和链上高频交易。然而它同样继承了DSA的铁律——两笔交易若共用了随机数k,私钥就会当场暴露。历史上曾有人因随机数生成器故障,把同一个k用在两笔比特币交易上,结果钱包被盗一空。舞步再精巧,假面也绝不能换第二次。

r=xkG mod n,s=k−1(H(m)+d⋅r) mod nr = x_{kG} \bmod n, \quad s = k^{-1}(H(m) + d \cdot r) \bmod n
P=u1G+u2Q,xP mod n=?rP = u_1 G + u_2 Q, \quad x_P \bmod n \stackrel{?}{=} r
  1. 临时点乘随机数k与基点G相乘得到点R,R的坐标就是签名的素材
    R=kGR = kG
  2. r的产生取R的x坐标并对曲线阶n取模,得到第一段签名
    r=xR mod nr = x_R \bmod n
  3. s的产生私钥d、摘要和r共同夹出第二段签名s
    s=k−1(H(m)+d⋅r) mod ns = k^{-1}(H(m) + d \cdot r) \bmod n
  4. 验签恢复点验证方用公钥Q重建点P,若P的x坐标模n等于r,签名有效
    P=u1G+u2Q,xP mod n=rP = u_1 G + u_2 Q, \quad x_P \bmod n = r

安全边界与盲签名:蒙眼的印章

大师的印再神奇,也怕三件事:印被偷、印泥被掺假、大师被逼着在空白纸上盖章。数字签名同理:私钥泄露等于印被偷,哈希碰撞等于印泥被掉包,随机数出问题等于盖章的力道被人摸透。防护之道无外乎三条:私钥锁进硬件安全模块,签名前必先哈希,每次签名更换随机数。做到这三点,签名者才真正“赖不掉”——因为任何人都能用公开公钥验证,证据确凿。

但现实中还有一类难题:如何让大师“蒙着眼睛”在一份看不见内容的文件上盖章,同时保证文件没有被偷换?电子投票、匿名支付都有此需求——选民不想让计票机构知道投了谁,但机构必须确认“这是合格选民”。RSA盲签名给出了精巧的三步曲:用户先把消息乘上一个随机盲因子,变成一封“信封”;大师隔着信封签上名;用户再剥掉信封,得到一份普通而有效的签名。

三步曲的数学表达如下:

这套流程就像投票站的保密信封:信封上盖着选务人员的官印,开箱后谁也看不出这张票原来被谁监过章。盲签名让“权威背书”与“隐私保护”同时成立,是电子现金、匿名投票、防追踪凭证的基石。它看似违背了“签名者应对内容负责”的直觉,实则通过随机盲因子,把“看过内容才签”和“签了却不知道内容”之间画出一道精妙的数学界线。

m′=m⋅re mod n,s′=(m′)d mod n,s=s′⋅r−1 mod nm' = m \cdot r^e \bmod n, \quad s' = (m')^d \bmod n, \quad s = s' \cdot r^{-1} \bmod n
  1. 盲化用户用随机盲因子r的e次方乘消息,信封裹住了内容
    m′=m⋅re mod nm' = m \cdot r^e \bmod n
  2. 蒙眼签名签名者用私钥d对盲化后的m′签名,他看不见也猜不出内容
    s′=(m′)d mod ns' = (m')^d \bmod n
  3. 去盲用户用r的逆元剥掉盲因子,得到对原消息m的合法签名s
    s=s′⋅r−1 mod ns = s' \cdot r^{-1} \bmod n

PKI公钥基础设施:谁为印谱背书

骗子可以伪造一本“大师印谱”,号称是大师亲笔刊印。收藏家如何知道手中的《印谱》没有被掉包?这就需要一位公认的“皇家印鉴院”——CA(证书颁发机构)。它先用自己最权威的印章,为你的印谱背书,签发一张数字证书,把“谁是大师、大师的公钥长什么样”白纸黑字固定下来。信任不再是一对一的赌注,而是一条从权威根部延伸下来的链条。

PKI就是这样一套信任生态:CA负责核验身份并签发证书;证书把“姓名+公钥+有效期”打包,再用CA私钥签名;用户在验证他人公钥前,只需信任CA的公钥,这个信任锚一确立,整个链条就能逐级验证。证书本身就是一个被CA签过名的数据包,验证时从终端证书回溯到根CA,每一级都用上一级的公钥解锁下一级的签名,全链通畅才敢认“这块公钥属于那个人”。

证书的结构可以写成:

打开浏览器访问HTTPS网站时,浏览器就是在做这件事:沿着证书链把服务器的公钥一路验到系统内置的根CA。没有PKI,公钥就如无主野印,谁都能刻一本假印谱;有了CA的背书,印谱上多了一道皇家印鉴,收藏家只需认准皇家印鉴院的纹路。从大师的印章、公开的印谱,到权威的背书,一套可信的“签字盖章”江湖就此闭环,这也是现代互联网信任体系的最后一块基石。

Cert=Sign(skCA, ID ∥ pkuser ∥ 有效期)Cert = \mathrm{Sign}(sk_{CA}, \ ID \ \parallel \ pk_{user} \ \parallel \ \text{有效期})
  1. 证书签发CA用自己的私钥,对用户身份和公钥的拼接串进行签名
    ID∥pkuser∥有效期ID \parallel pk_{user} \parallel \text{有效期}
  2. 证书验证任何人用CA的公钥验证证书签名,确认证书没有被篡改
    Verify(pkCA,Cert)=1\mathrm{Verify}(pk_{CA}, Cert) = 1
  3. 信任链回溯从用户证书逐级验证到中间CA、根CA,形成完整信任链
    Certuser→Certmid→CertrootCert_{user} \to Cert_{mid} \to Cert_{root}

AI 应用场景

场景一:AI模型与软件供应链安全

阶段:模型发布与分发阶段

解决的问题:传统方式发布模型权重或安装包时,下载者无法分辨文件是否被中间人替换成带后门的版本。通过数字签名,发布者对模型文件的哈希做私钥签名,用户下载后用公钥验签,确保模型来自官方且未被篡改。

具体案例:某AI公司发布开源大模型时,随附 .sig 签名文件和公钥指纹;用户在Hugging Face下载后执行 gpg --verify 校验签名,发现哈希不匹配立即报警。CI流水线在产物生成后自动调用HSM中的私钥完成签名,杜绝人工介入。

场景二:区块链交易签名与钱包安全

阶段:去中心化网络的交易事务阶段

解决的问题:传统账本靠银行中心化记账,去中心化网络中没有可信第三方,如何证明一笔转账确实由私钥持有者发起?答案就是ECDSA签名:交易带上签名,全网节点用公钥验签后才会打包上链。

具体案例:比特币钱包用 secp256k1 椭圆曲线签名为每笔交易签名;以太坊则根据签名中的 r/s/v 值恢复出地址,确保交易指令不可篡改。AI训练数据市场的支付通道也常依赖链上签名,实现“数据买断”的自动化结算。

场景三:电子合同与政务一网通办

阶段:用户身份认证与文件签署阶段

解决的问题:传统纸质签字易伪造、易抵赖,跨机构流转效率低。基于PKI的数字签名让“签署人身份”与“文件完整性”同时得到法律承认,实现全程留痕、不可抵赖。

具体案例:某省政务App中,企业和个人使用USB Key内的私钥签署电子劳动合同,服务端通过国家CA证书链验证签名后归档。发生劳动争议时,仲裁庭直接提取签名验签记录作为电子证据,几分钟即可完成真伪认定。

Python 演示

python54 行
from cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import rsa, paddingfrom cryptography.exceptions import InvalidSignature def demo_rsa_sign():    # 1. 生成密钥对:私钥签名,公钥验证    private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)    public_key = private_key.public_key()     message = b"Important: transfer 1,000,000 to Bob."    # 2. 签名:SHA-256先浓缩摘要,再用PSS填充后私钥运算    signature = private_key.sign(        message,        padding.PSS(            mgf=padding.MGF1(hashes.SHA256()),            salt_length=padding.PSS.MAX_LENGTH        ),        hashes.SHA256(),    )    print("Signature length:", len(signature), "bytes")     # 3. 验证:公钥验签,成功说明真实且完整    try:        public_key.verify(            signature,            message,            padding.PSS(                mgf=padding.MGF1(hashes.SHA256()),                salt_length=padding.PSS.MAX_LENGTH            ),            hashes.SHA256(),        )        print("Verify OK: signature is authentic!")    except InvalidSignature:        print("Verify FAILED: signature invalid!")     # 4. 篡改演示:改动一个字符,签名立刻失效    tampered = b"Important: transfer 1 dollar to Bob."    try:        public_key.verify(            signature,            tampered,            padding.PSS(                mgf=padding.MGF1(hashes.SHA256()),                salt_length=padding.PSS.MAX_LENGTH            ),            hashes.SHA256(),        )        print("Tampered still valid? Wrong!")    except InvalidSignature:        print("Tamper detected: signature verification failed!") if __name__ == "__main__":    demo_rsa_sign()
目的:用 Python cryptography 库完整演示 RSA 数字签名的签名、验签与篡改检测流程,对应正文中“先哈希、再私钥签名、公钥验证”的原理。
  1. private_key = rsa.generate_private_key(...)生成2048位RSA密钥对,类似铸造天工印。
  2. public_key = private_key.public_key()从私钥导出公钥,相当于刊印《印谱》。
  3. signature = private_key.sign(...)核心签名调用:先哈希浓缩,再用私钥运算。
  4. padding.PSS(...)使用PSS填充,防止教科书RSA的乘法同态伪造。
  5. public_key.verify(...)核心验签调用:用公钥恢复摘要并比对。
  6. except InvalidSignature密码库抛此异常即代表签名无效或内容被篡改。
  7. tampered = b"..."构造篡改消息,验证签名对“一人一字之差”的零容忍。

常见误区

误区数字签名就是拿私钥把整篇消息“加密”一遍,所以别人看不到内容,像发了一封密信。

正解数字签名并不加密原文,它只对消息的哈希值做私钥运算。任何人拿到签名都能用公钥解出摘要,却无法从摘要还原消息——机密性需要另外用加密算法实现。就像印章盖在字画角落,谁都看得见字画内容,印章只是证明真伪。

为何常见:大家把“用私钥做运算”直觉等同于“加密”,忽略了签名方向的目标是认证而非保密。

误区公钥加密和数字签名都是非对称算法,数学上差不多,可以混着用。

正解两者面向相反的安全目标。公钥加密用公钥加密、私钥解密,目标是机密性;数字签名用私钥签名、公钥验证,目标是认证与不可否认。即使数学结构同是RSA,填充方案也完全不同——加密用OAEP,签名用PSS。拿加密方案当签名用,会引入同态伪造漏洞。

为何常见:初学时只看到“私钥/公钥”这对概念的表面对称,忽略了目标差异导致工程规范分道扬镳。

误区验签成功后,我就能从签名里“解出”消息原文,所以签名可以替代文件传输。

正解验证签名的本质是:用公钥从签名中恢复出的是“消息的哈希摘要”,而不是消息本身。验证通过只说明“摘要匹配”,原文是随签名一起单独发送的。就像印谱对照的是“印章纹路”而非整幅字画,你不可能从一枚章印里读出整幅画的内容。

为何常见:把RSA的模幂逆运算误解为“解回原文”,忽略了哈希函数的单向性。

误区对方发来一条带签名的消息,验签通过了,就说明消息一定是对方此刻亲手发送的。

正解签名只能证明“某个时刻持有私钥的人签署了这段内容”,它不携带时间信息,也不能防止签名者事后声称“我的私钥丢了”或被重放攻击。实际系统必须结合时间戳、随机数挑战(nonce)和双向协议,甚至引入公证日志,才能锁定“此刻确实在对话中”。

为何常见:把“签名验证”的静态事实误当成“通信会话”的动态事实,忽略了协议上下文对安全语义的补充。

面试题

Q1. 数字签名主要解决下列哪个问题?

单选题 · easy

  • A.对通信内容进行加密保密
  • B.提供身份认证、数据完整性与不可否认性← 正确答案
  • C.压缩传输数据以提高带宽
  • D.实现对称密钥的自动生成

答案:B。数字签名的核心目标是认证与完整,签名者用私钥签名、验证者用公钥验证,确保“谁签的、改没改、赖不掉”。选项A是加密的目标,C是压缩算法,D与签名无关,均不符合签名设计初衷。

Q2. RSA签名中,签名者使用哪个密钥来生成签名?

单选题 · easy

  • A.公钥
  • B.私钥← 正确答案
  • C.对称密钥
  • D.会话密钥

答案:B。签名者持有私钥,用它生成签名;验证者用公钥验签。如果把公钥给别人当签名,任何人都能冒充签名者。私钥相当于大师的天工印,公钥只是印谱。

Q3. 数字签名的核心性质包括哪些?

多选题 · mid

  • A.身份认证← 正确答案
  • B.机密性
  • C.完整性← 正确答案
  • D.不可否认性← 正确答案

答案:ACD。数字签名提供身份认证(能确认签名者身份)、完整性(内容被篡改则验证失败)、不可否认性(签名无法抵赖)。机密性由加密算法提供,签名不保证内容不被看到,因此B错误。

Q4. 在ECDSA中,公钥Q与私钥d的关系是?

单选题 · mid

  • A.Q = d × G,其中G是椭圆曲线基点← 正确答案
  • B.Q = d 的哈希值
  • C.Q = p × q 的结果
  • D.Q与d完全无关

答案:A。ECDSA的私钥是随机数d,公钥是d与基点G做标量乘法得到的点Q。从Q反推d是椭圆曲线离散对数难题,这正是安全性的根本。选项B/C都是混淆RSA或哈希的概念。

Q5. DSA签名中,如果随机数k被重用两次用于不同消息,会发生什么?

单选题 · mid

  • A.没有任何影响
  • B.签名长度变长
  • C.攻击者可推导出私钥← 正确答案
  • D.签名自动失效

答案:C。两次签名共用k时,两对 r/s 联立方程组可以消去k与私钥x,直接解出私钥。随机数k就像领舞者的假面,换两次同样假面就会被观众认出真身,私钥随之泄露。

Q6. 关于RSA盲签名,下列说法正确的是?

多选题 · mid

  • A.签名者不知道消息内容← 正确答案
  • B.签名者事后一定可以追踪到消息
  • C.用户去盲后得到普通有效的签名← 正确答案
  • D.随机盲因子保护了用户隐私← 正确答案

答案:ACD。盲签名通过随机盲因子r让签名者无法看到消息内容,去盲后得到的签名与普通签名无异且无法被追踪。由于盲因子随机且用户私密保管,签名者做不到事后追踪,因此B错误,A/C/D正确。

Q7. PKI体系中,CA(证书颁发机构)的主要职责是?

单选题 · hard

  • A.加密所有用户的业务数据
  • B.签发数字证书,将公钥与身份绑定← 正确答案
  • C.集中存储全网的私钥
  • D.对每一笔网络流量做签名

答案:B。CA负责核验主体身份后签发证书,证书本质是“身份+公钥+有效期”的签名数据包。它不加密业务数据,也绝不该存用户私钥。全网流量签名既不现实也不在CA职责范围内。

Q8. 使用无填充的教科书RSA签名有哪些典型风险?

多选题 · hard

  • A.乘法同态性会导致选择性伪造← 正确答案
  • B.签名无法被任何方式验证
  • C.签名结果必然为空
  • D.小指数情况下可被平方根攻击← 正确答案

答案:AD。教科书RSA签名直接对消息做模幂,签名满足乘法同态:两个签名相乘等于乘积的签名,攻击者可构造伪造;指数e很小时,小消息签名还可被平方根攻击提取。它仍可被验证,所以B错误;签名也不是空值,C错误。PSS填充正是为了封堵这些漏洞。

Q9. ECDSA验签流程的最后一步检查是什么?

单选题 · hard

  • A.计算点 P = u1G + u2Q,验 x_P mod n 是否等于 r← 正确答案
  • B.检查公钥的二进制位数是否达标
  • C.检查签名长度是否为固定值
  • D.检查基点G是否在曲线上

答案:A。验签核心是用公钥Q和辅助参数u1、u2重建点P,若P的x坐标模曲线阶n等于签名中的r,则签名合法。选项B/C只是工程检查,选项D是系统参数预检,都不是验签的判定条件。

Q10. 下列哪些属于PKI体系的组成部分?

多选题 · easy

  • A.证书颁发机构CA← 正确答案
  • B.证书库与目录服务← 正确答案
  • C.证书吊销列表CRL← 正确答案
  • D.密码暴力破解服务器

答案:ABC。PKI包括CA(签发证书)、证书库(发布和查询证书)以及CRL/OCSP(吊销失效证书)等组件。暴力破解服务器不属于信任基础设施,反而是一种攻击工具,因此D错误。