2017-01-25 4 views
2

Wir verwenden eine API von einem anderen Unternehmen.
In dieser API sollte ich ein Schlüsselpaar mit RSACryptoServiceProvider generieren und den öffentlichen Schlüssel senden, damit sie Daten für uns verschlüsseln können.RSA - Verschlüsselung mit nur Modul (!)?

Das ist nicht ein Problem. In ihrer API - der öffentliche Schlüssel ist ein byte[] Typ.

Also dachte ich, wie etwas zu tun:

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

Und dann stellen sie als byte[]:

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

Und diesen Wert senden.

Aber sie antwortete:

"Sie sollten nur liefern uns die Modulus Eigenschaft im RSAKeyInfo info"

Also habe ich fragte mich: Ist es möglich? Können sie Daten nur mit Modulus verschlüsseln?

Also habe ich einen Test erstellt: (bitte My Code und Their code bemerken)

//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); 

Ergebnis: Ausnahme:

Cryptographic Fehler beim OAEP padding Decodierung.

Frage

1) Ist es für sie möglich, nur mit Modul zu verschlüsseln?

2) Wenn ja, was ist falsch an meinem Test und wie kann ich es beheben?

Bearbeiten - auch wenn ich die exponenet hinzufügen, schlägt es:

//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

Ich würde denken, dass sie das Modul und den Exponenten brauchen. Etwas scheint hier ziemlich dämlich zu sein. –

+0

@EricLippert Hallo Eric. Selbst wenn ich den Exponenten anbiete, [es failes] (https://i.imgur.com/H1uMPRG.jpg) –

+0

Die Modulus-Art von ** ist ** der öffentliche Teil des Schlüssels (privater Schlüssel = alle Faktoren getrennt), aber ohne den Exponenten ist es nutzlos, oder? –

Antwort

0

Ok, hier ist die Sache.

Es scheint, dass in der letzten Zeile den neuen Wert einstellen:

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

, becuase RSAParameters zum rsa2 Objekt nicht wirklich sichtbar war, ist eine Struktur.

So brauchen wir rsa2 zu importieren diese Struktur.

Ich habe diese Zeile:

rsa2.ImportParameters(rsa2Params); 

Auch - ein Exponent ist sicherlich notwendig. Wie kommt es, dass es auf ihrer Seite funktionieren kann, ohne dass ich ihnen den Exponenten zur Verfügung stelle?Nun, das ist der Standardwert für den Exponenten in der heutigen Welt (0x010001). Also das ist der Grund, warum sie es

Wie dem auch sei nun alle Werke verschlüsseln:

enter image description here

0

1) Der Modulus und Exponent sind notwendig für die Verschlüsselung. Wird auch verwendet, um den entsprechenden privaten Schlüssel für die Entschlüsselung zu finden.

2) Sie haben den privaten Schlüssel in RSACryptoServiceProvider nicht festgelegt, sodass Sie das Byte-Array nicht entschlüsseln können.

+0

In Bezug auf 2 existiert der private Schlüssel in meiner Seite. Auf ihrer Seite tut es nicht. Sie müssen nur –

+0

verschlüsseln. Überprüfen Sie bitte den Inhalt Ihres privaten Schlüssels. Wenn Sie den richtigen privaten Schlüssel verwenden, sollten der Modul und der Exponent des privaten Schlüssels mit Ihrem öffentlichen Schlüssel übereinstimmen. – anguspcw

+0

Sie sind. Ich kenne. Ich wusste einfach nichts über den Standardwert des Exponenten (den ich ihnen nicht lieferte). und so nicht verstanden, wie können sie ohne den exp-Teil verschlüsseln. –

Verwandte Themen