1

我的任务是测试我们公司软件的安全性。我们公司的软件生成 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的位是未知的。

任何帮助将不胜感激。谢谢。

4

0 回答 0