我在发送消息和签名的渠道非常有限,并且已经指出(在https://crypto.stackexchange.com/questions/3075/asymmetric-algorithm-to-generate-compact-unique-messages-that-can-be-validated/处)ECDSA提供了最紧凑的非对称算法。

我已经很容易做到这一点,因为:

void Main()
{
    byte[] publickey;
    byte[] data;
    byte[] signature;

    using (var dsa = new ECDsaCng(256))
    {
        dsa.HashAlgorithm = CngAlgorithm.Sha256;
        publickey = dsa.Key.Export(CngKeyBlobFormat.EccPublicBlob);

        data = new byte[] { 21, 5, 8, 12, 207 };

        signature = dsa.SignData(data);
    }

    Console.WriteLine(signature.Length);
    Console.WriteLine(Convert.ToBase64String(signature));

    using (var dsa = new ECDsaCng(CngKey.Import(publickey, CngKeyBlobFormat.EccPublicBlob)))
    {
        dsa.HashAlgorithm = CngAlgorithm.Sha256;

        if (dsa.VerifyData(data, signature))
            Console.WriteLine("Data is good");
        else
            Console.WriteLine("Data is bad");
    }
}


但是我希望能够牺牲一些力量,并且使用少于BCL提供的最小256位密钥大小的方法,而且我还没有找到能够满足我需要的实现。

我尝试了BouncyCastle,但似乎开箱即用也有相同的限制。

我有什么选择?是否有另一种实施方式可以解除实施限制?

最佳答案

您可以使用轻量级的Bouncy Castle库对几乎在F(2m)或F(P)上的任何曲线(包括位尺寸较小的曲线)执行EC加密。我建议您使用标准曲线,例如Org.BouncyCastle.Asn1.Nist.NistNamedCurves类中定义的曲线。

最小的NIST曲线为163位,尽管我建议非实时通信的最小NIST曲线为192位。请注意,与名为curve的256位(256-192 = 64位,64 * 2/8 = 16字节)相比,总共只能节省大约16个字节。

Brainpool曲线也很安全地生成并定义得很好。您可以在Org.BouncyCastle.Asn1.TeleTrusT命名空间中找到它们。

09-25 21:05