椭圆曲线数字签名算法是DSA的一种椭圆曲线变体,它发明的初衷只是避免使用Schnorr签名的专利。椭圆曲线数字签名算法依赖于验证器中的私钥和主机用于验证验证器的公钥。它的缺点和DSA一样,它也没有提供安全性证明。
椭圆曲线算法
DSS(数字签名标准)定义了两种用于ECC(椭圆曲线密码学)的椭圆曲线:伪随机曲线,其系数由种子密码散列函数的输出生成;以及特殊曲线,其系数和下伏场已被选择以优化椭圆曲线运算的效率。伪随机曲线可以定义在素域GF(p)以及二进制域GF(2m)上。
素数域是包含素数p个元素的域GF(p)。这个字段的元素是以p为模的整数;场运算是根据整数模p的运算来实现的。适用的椭圆曲线的形式为y²=x³+ax+b。
密钥对生成
在ECDSA验证器能够工作之前,它需要知道自己的私钥。公钥是从私钥和域参数派生而来的。密钥对必须位于验证器的内存中。顾名思义,私钥是无法从外部世界访问的。相比之下,公钥必须是可公开读取和访问的。
启动一个随机数生成器,当其操作完成时,它会传递成为私钥d(标量)的数值。
签名计算
数字签名允许消息的接收者使用验证器的公钥验证消息的真实性。首先,使用安全散列算法将可变长度消息转换为固定长度消息摘要h(m)。
安全散列具有以下独特的特性:
1)不可逆性——从摘要中确定消息在计算上是不可行的;
2) 抗冲突-找到一个以上的消息来生成给定的摘要是不切实际的;
3)高雪崩效应消息中的任何变化都会在摘要中产生显著变化。在计算消息摘要之后,激活随机数生成器以提供用于椭圆曲线计算的值k。
k永远不能重复使用,它必须是不可预测的。否则,恢复私钥将变得十分简单。通常nonce(k值)会由密码学库在后台生成,但有时也会有算法调用方来提供。
另一种不易察觉的风险是,如果nonce(k值)不是均匀随机选取的,那么仍然存在能够立即恢复私钥的有效攻击(格攻击算法)。理论上,我们称这些类型的密钥检索攻击为完全攻破攻击。
签名由两个整数r和s组成。
以下等式表示了根据随机数k和基点G(x,y)计算r:
(x1, y1) = k × G(x, y) mod p
r = x1 mod n
若要有效,r必须不同于零。在r为0的罕见情况下,必须生成一个新的随机数k,并且需要再次计算r。
在成功计算r之后,根据等式3使用标量运算来计算s。输入是消息摘要h(m);私钥d;r以及随机数k:
s = ( (h(m) + d * r) mod n
若要有效,s必须不同于零。如果s为0,则必须生成新的随机数k,并且需要再次计算r和s。
签名验证
签名验证是签名计算的对应部分。其目的是使用验证器的公钥验证消息的真实性。使用与签名步骤中相同的安全散列算法,计算由认证器签名的消息摘要,该消息摘要与公钥Q(x,y)以及数字签名分量r和s一起产生结果。
输入是消息摘要h(m)、公钥Q(x,y)、签名分量r和s以及基点G(x,y):
w = s-1 mod n
u1 = (h(m) * w) mod n
u2 = (r * w) mod n
(x2, y2) = (u1 × G(x, y) + u2 × Q(x, y)) mod n
如果x2等于r,则验证成功(“通过”),从而确认签名确实是使用私钥计算的。