2

パスワードを安全にしようとしていますが、RSA の使い方に問題があります。私のコードは次のとおりです。

    private void testencodedecode()
    {
        string mehdi = "mehdi";
        var enc = encodePass(mehdi);
        var dec = decodePass(enc);
    }
    private RSAParameters rsaKey()
    {
        var setting = context.Settings.First(s => s.ID == 1);

        byte[] pwd = Encoding.ASCII.GetBytes(setting.PWDKEY);

        byte[] expo = {1,0,1};

        var key = new System.Security.Cryptography.RSAParameters();
        key.Exponent = expo;
        key.Modulus = pwd;

        return key;
    }

    private string encodePass(string pass)
    {
        var provider = new RSACryptoServiceProvider();
        provider.ImportParameters(rsaKey());

        var encryptedBytes = provider.Encrypt(Encoding.UTF8.GetBytes(pass), false);

        return Encoding.UTF8.GetString(encryptedBytes);
    }

    private string decodePass(string pass)
    {
       var provider = new RSACryptoServiceProvider();
       provider.ImportParameters(rsaKey());
       string decrypted = Encoding.UTF8.GetString(provider.Decrypt(Encoding.UTF8.GetBytes(pass), true));
       return decrypted;
    }

正常に暗号化されているようですが、復号化すると次のエラーが発生します。

復号化するデータが、このモジュラスの最大値である 36 バイトを超えています。

4

2 に答える 2

3

ここでの方法にはいくつかの大きな問題があります。最初に、別の回答のコメントで述べたように、a を使用しGuidて RSA モジュラスを構築していることですが、これは完全に無効です。いくつかの理由により、ランダム データを使用して公開鍵を直接作成することはできません。

  1. モジュラスは、特定の構造に準拠する必要があります。つまり、2 つの大きな素数の積であるのに対して、Guid2 進数の形式は一般的にそうではありません。
  2. RSA 暗号化データを復号化するには、モジュラスの生成に使用される 2 つの素数を知っている必要があります。ランダムモジュラスが魔法のように2つの大きな素数の積であったとしても、それらを決定することはできません。これにはモジュラスを因数分解する必要があり、これは意図的に難しいことです(実際、難しさはRSAの安全)。

RsaCryptoServiceProviderコンストラクターを使用して RSA キーを生成する必要があります。

// Construct the RsaCryptoServiceProvider, and create a new 2048bit key
var csp = new RsaCryptoServiceProvider(2048);

次に、この新しく生成されたキーのパラメーターをエクスポートできます。

// Export the RSA parameters, including the private parameters
var parameters = csp.ExportParameters(true);

その後、パラメータを (安全に) 保存し、後で復号化するために CSP を再初期化するために使用できます。

RSA で実際に暗号化できるデータの量は鍵のサイズによって制限されるなど、他にも明らかな問題があるため、上記で作成した 2048 ビットの鍵を使用すると、2048 / 8 - 11 = 245 バイトを暗号化できます。 (11 バイトは、PKCS#1 v1.5 パディングが適用された結果です)。これ以上暗号化したい場合、一般的な方法は、対称暗号 (AES など) を使用してデータを暗号化し、次に RSA のみを使用して AES キーを暗号化することです。

最後に、これは機能する可能性がありますが、ロール・ユア・オウンの暗号化スキームにはほとんど常に問題があるため、セキュリティのためにこれに依存することはありません.

于 2013-03-13T16:43:21.457 に答える
0

RSA のモジュラスは、少なくとも 1024 ビット (128 バイト) である必要があります。それ以下のものは完全に安全ではありません。また、最新のアプリケーションでは、2048 以上のモジュラスを使用することも推奨されています。

次に、RSA キーを適切に生成していません。パスワードをモジュラスとして使用するだけではいけません..

公開指数とモジュラスは、モジュラスを割るp-1すべての素数に対して指数が相対的に素になるように選択する必要があります。pモジュラスをパスワードのバイナリ表現 ( PWDKEY) に任意に設定している場合、適切な指数/モジュラスのペアを選択しているとは考えにくいです。前述したように、モジュラスは比較的大きな数でなければならず、通常は 1024、2048、または 4096 ビット長に選択されます。

于 2013-03-13T15:25:19.973 に答える