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 imRSAKeyInfo
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.
Ich würde denken, dass sie das Modul und den Exponenten brauchen. Etwas scheint hier ziemlich dämlich zu sein. –
@EricLippert Hallo Eric. Selbst wenn ich den Exponenten anbiete, [es failes] (https://i.imgur.com/H1uMPRG.jpg) –
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? –