2

我有一个非常有限的渠道来发送消息和签名,并且已被指示(在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,而且它似乎开箱即用也有同样的限制。

我有哪些选择?是否有另一种实现可以解除实现限制?

4

1 回答 1

3

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

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

Brainpool 曲线也相当安全地生成和明确定义。您可以在Org.BouncyCastle.Asn1.TeleTrusT命名空间中找到它们。

于 2012-06-28T20:29:54.540 回答