2017-01-25 6 views
2

私たちは別の会社のAPIを使用しています。
このAPIでは、RSACryptoServiceProviderを使用してキーペアを生成し、私たちのデータを暗号化できるように公開鍵を送信する必要があります。RSA - (!)モジュラスのみを使用した暗号化?

これは問題ではありません。 APIでは、公開鍵はbyte[]タイプです。

だから私は何かやって考えた:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); 
var pubKey = rsa.ToXmlString(false); //only public 

をそして、byte[]としてそれを表す:

var ValuetoSend = Encoding.UTF8.GetBytes(pubKey); 

し、その値を送信します。

しかし、彼らは答えた:

をだから私は不思議に思っていました

"あなただけRSAKeyInfo 情報に私たちにModulusプロパティを提供する必要があり"、それは可能ですか? Modulusを使用してのみデータを暗号化できますか?

だから私は、テストを作成しました:(My CodeTheir codeを何卒ご了承下さい)

//My Code 
    byte[] data_clear = UTF8Encoding.UTF8.GetBytes("hellowא"); 
    var rsa = new RSACryptoServiceProvider(1024); 
    var MyModulus = rsa.ExportParameters(true).Modulus; 



    //Their code (I assume , If they only want MyModulus) 
    var rsa2 = new RSACryptoServiceProvider(1024); 
    var rsa2Params = rsa2.ExportParameters(true); 
    rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus 
    byte[] enc_data = rsa2.Encrypt(data_clear, true); 

    // Back to my code 


    var g=Encoding.UTF8.GetString(rsa.Decrypt(enc_data, true)); 
    Console.WriteLine(g); 

の検索結果を: 例外:OAEPパディングのデコード中

CryptographicExceptionエラーが発生しました。

質問

1)は、それが彼らのためにのみ弾性係数を使用して暗号化することは可能ですか?

2)そうであれば、私のテストには何が問題なのですか?どのように修正できますか?

編集 - 私はexponenetを追加した場合でも、それは失敗します。

//My Code 
    byte[] data_clear = UTF8Encoding.UTF8.GetBytes("hellowא"); 
    var rsa = new RSACryptoServiceProvider(1024); 
    var MyModulus = rsa.ExportParameters(true).Modulus; 
    var MyExponent = rsa.ExportParameters(true).Exponent; 



    //Their code (I assume , If they only want MyModulus) 
    var rsa2 = new RSACryptoServiceProvider(1024); 
    var rsa2Params = rsa2.ExportParameters(true); 
    rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus 
    rsa2Params.Exponent=MyExponent; //they set their Modulus to MY Modulus 
    byte[] enc_data = rsa2.Encrypt(data_clear, true); 



    // Back to my code 
    var g=Encoding.UTF8.GetString(rsa.Decrypt(enc_data, true)); 
    Console.WriteLine(g); 

    //CryptographicException Error occurred while decoding OAEP padding. 
+0

私はモジュラスと指数が必要だと思います。ここでは何かがかわいらしいようです。 –

+0

@EricLippertこんにちはエリック。指数を与えても、それは失敗する(https://i.imgur.com/H1uMPRG.jpg) –

+0

**のモジュラスの種類は**キーの公開部分である(秘密鍵=全ての要素を別々に)、指数がなければ無駄だよね? –

答えて

0

[OK]を、ここで事があります。構造体である

var rsa2 = new RSACryptoServiceProvider(2048); 
var rsa2Params = rsa2.ExportParameters(false); 
rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus 

、RSAParameters becuase rsa2オブジェクトには本当に見えませんでした:

で最後の行に新しい値を設定することと思われます。

ですので、rsa2のインポートの構造が必要です。

私は、この行を追加:また

rsa2.ImportParameters(rsa2Params); 

を - 指数が確実に必要とされています。だから私は彼らが指数を提供することなく自分たちの側でそれを動作させることができますか?これは、今日の世界(0x010001)の指数のデフォルト値であるためです。モジュラスおよび指数は、暗号化に必要な

enter image description here

0

1):それはすべての作品だからそれは、彼らが今、とにかく

を暗号化することができる理由です。また、解読のために対応する秘密鍵を見つけるためにも使用されます。

2)バイト配列を解読できないようにRSACryptoServiceProviderで秘密鍵を設定していません。

+0

2に関しては、私の側の秘密鍵が存在します。彼らの側では、それはdoesntです。彼らは暗号化する必要があります –

+0

正しい秘密鍵を使用している場合は、秘密鍵の内容を確認してください。秘密鍵の法と指数は公開鍵と同じにする必要があります。 – anguspcw

+0

です。知っている。指数のデフォルト値についてはわかりませんでした。また、どのようにしてexpパートなしで暗号化できるのか理解できませんでした。 –

関連する問題