4

検索してきましたが、RSA を使用して復号化する簡単な方法が見つからないようです。

公開鍵と秘密鍵を生成しました。これらは 2 つの別々のファイルに保存され、XML 形式になっています。FromXmlString を使用して公開鍵を RSACryptoServiceProvider オブジェクトに関連付けてから、文字列を暗号化することに問題はありません。暗号化された文字列を解読しようとすると、混乱が生じます。Decrypt 関数を使用できるように、秘密鍵データを RSACryptoServiceProvider に関連付ける方法がわかりません。

どんな助けでも大歓迎です。

編集:

公開鍵と秘密鍵の形式は、RSACryptoServiceProvider オブジェクトによって生成された XML であり、これをファイルに入れました。

<RSAKeyValue><Modulus>vS7Y5up+6kHMx7hQjKA6sKlIVASaw  ... etc ...

次のコードを使用して公開鍵を読み込みます。

StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath("public.key"));
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(sr.ReadToEnd().ToString());


どこから始めればよいかわからないため、現在、秘密鍵を使って何も試していません。

4

1 に答える 1

1

あなたの状況はわかりませんが、キー情報を KeyContainer に保存することをお勧めします。これを行うと、名前で keyContainer にアクセスでき、次のようなことができます。

// retrieves the maximum number of characters that can be decrypted at once
private int getMaxBlockSize(int keySize){
    int max = ((int)(keysize/8/3) )* 4
    if (keySize / 8 mod 3 != 0){
        max += 4
    }
    return max;
}

public string decrypt(string msg, string containerName){
    CspParameters params = new CspParameters();
    params.KeyContainerName = containerName;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(params);
    StringBuilder decryptedMsg = new StringBuilder();
    int maxDecryptSize = getMaxBlockSize(rsa.KeySize);
    int iterationCount = Math.Floor(msg.length / maxDecryptSize)
    for(int i=0; i<iterationCount; i++){
        int start = i * maxDecryptSize;
        int blkSize = Math.min(start + maxDecryptSize, msg.Length);
        Byte[] msgBytes = System.Convert.FromBase64String(msg.Substring(start, blkSize));

        decryptedMsg.Append(System.Text.Encoding.Unicode.GetString(RSAProvider.Decrypt(msgBytes, false));
    }
    return decryptedMsg.ToString();
}

私はこれをテストしていないので、ここにバグがあるかもしれませんが、あなたはアイデアを得ます.

于 2012-08-15T21:28:56.210 に答える