我的任务是测试我们公司软件的安全性。我们公司的软件生成 ecdsa 签署的供应订单文件。一个人可以根据需要生成任意数量的文件。
所以我的问题是如果我有数百万个签名,是否有任何 ECDSA 攻击?
我们使用 112 位素数曲线顺序:4451685225093714776491891542548933
我使用以下方法计算了 100 万个签名:
public void GenerateSignature()
{
//curve order
BigInteger n = ec.N;
Ramdom rand = new Random();
//private key
BigInteger d = ((ECPrivateKeyParameters)key).D;
//loop for 1 million signatures
for (int i = 1; i <= 1000000; i++)
{
//random k and e
BigInteger e = new BigInteger(112, rand).Mod(n); //new biginteger by giving bitlength and random
BigInteger k = new BigInteger(112, rand).Mod(n);
//calculate r
BigInteger r = key.Parameters.G.Multiply(k).X.ToBigInteger().Mod(n);
//calculate s
BigInteger s = k.ModInverse(n).Multiply(e.Add(d.Multiply(r))).Mod(n);
//save generated signatures to database
new DBCon().ExecuteNonQuery("Insert into signatures values ('" + e.ToString() + "', '" + r.ToString() + "', '" + s.ToString() + "')");
}
}
我正在使用带有 C# 的 BouncyCastle 加密库。
我知道如果d = (sk - e) / r知道 k 值,则可以计算私钥
我也知道如果两个签名具有相同的 r 值,则可以计算私钥,然后我们可以通过k = (e1 - e2) / (s1 - s2)计算 k ,然后使用上述公式计算 d。
我也知道,如果使用大约 100 个带有格子攻击的签名已知k的某些位,则可以计算出私钥,但在这种情况下,k的位是未知的。
任何帮助将不胜感激。谢谢。