2

私はメッセージと署名を送信するための非常に限られたチャネルを持っており、示されています(https://crypto.stackexchange.com/questions/3075/asymmetric-algorithm-to-generate-compact-unique-messages-that -検証可能/)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

軽量のBouncyCastleライブラリを使用して、ビットサイズが小さいものも含め、F(2m)またはF(P)を超えるほぼすべての曲線でEC暗号化を実行できます。Org.BouncyCastle.Asn1.Nist.NistNamedCurvesクラスで定義されているような標準曲線を使用することをお勧めします。

最小のNIST曲線は163ビットですが、非リアルタイム通信には最小192ビットにすることをお勧めします。256ビットの名前付き曲線(256-192 = 64ビット、64 * 2/8 = 16バイト)と比較して、合計で約16バイトしか節約できないことに注意してください。

ブレインプール曲線もかなり安全に生成され、明確に定義されています。それらはOrg.BouncyCastle.Asn1.TeleTrusT名前空間にあります。

于 2012-06-28T20:29:54.540 に答える