2017-10-23 2 views
0

ich eine publickey haben, ist:C# - Convert String mit Public Key (mod) und Exponent RSA PKCS # 1.5

a383a2916281721498ff28226f851613bab6f89eb0536e9f237e158596d3b012e5707eba9f2a2963faca63fcb10f5de79caf246c1f587ee6e8f895fd848f2da5aba9d71af4dd8d06e99ff3729631626ed3f3202e56962957c0110a99d2b3893feb148291e09b54fe7df121751fb8bb589576542321b4f548be06b9845ebc6bbef1427741c00b632c05854146b597fdef5a89ace1556a769c5eaff8fc0589e7ad4adb2e2a929969c77f395b2f5a276a9389d1f43c061c9459a65b77bcd581c107aa8424223a0b44ee52582362cc96b90eea071a0dda5e9cb8fd5c9fd4ac86e177c07d79071788cb08231240dc1c9169af2629ecec31751069f0c7ccc1c1752303
(Not Base64)

und ein Exponent, das ist:

010001
(Again not base64)

und ich brauche zu konvertieren dies zusammen mit einer kleinen Zeichenfolge zu RSA PKCS # 1.5 Aber ich bin ein bisschen verwirrt, es hält mich Fehler beim Versuch, es zu tun anscheinend ist der Exponent falsch formatiert und der öffentliche Schlüssel isnt base64?

Heres mein Code

string publicKey = "a383a2916281721498ff28226f851613bab6f89eb0536e9f237e158596d3b012e5707eba9f2a2963faca63fcb10f5de79caf246c1f587ee6e8f895fd848f2da5aba9d71af4dd8d06e99ff3729631626ed3f3202e56962957c0110a99d2b3893feb148291e09b54fe7df121751fb8bb589576542321b4f548be06b9845ebc6bbef1427741c00b632c05854146b597fdef5a89ace1556a769c5eaff8fc0589e7ad4adb2e2a929969c77f395b2f5a276a9389d1f43c061c9459a65b77bcd581c107aa8424223a0b44ee52582362cc96b90eea071a0dda5e9cb8fd5c9fd4ac86e177c07d79071788cb08231240dc1c9169af2629ecec31751069f0c7ccc1c1752303"; 
string exponant = "010001"; 
string toEncrypt = "Test123"; 
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
{ 
    RSAParameters rsap = new RSAParameters { 
     Modulus = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(publicKey))), 
     Exponent = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(exponant))) 
    }; 
    //Tried with and without the whole base64 thing 
    rsa.ImportParameters(rsap); 
    byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(toEncrypt), false); 
    string base64Encrypted = Convert.ToBase64String(encryptedData); 
    x = x.Replace(match, text.Contains("(URLENCODE)") ? WebUtility.UrlEncode(base64Encrypted) : base64Encrypted); 
} 

Cryptographic: Bad Daten.
Occuring On: rsa.ImportParameters (rsap);

habe ich das fertige Ergebnis:

PV7v6F8AOJvIJA6yYJReUf3jRD8HL5LzNIIqs4ehKlwxt00xyvnCCy/MiSX/4ZP6+IZfXPGAs57kM2/KsUau+fgU4p0rxJM569MLZ+RFjBnI/ATE1Ru5v8D2ZcJ89Y0Z3xowVnNMaytwacRf/LZqxIAFpBr/E5G6KSHkSg+3zQIu6RrxbHPrWeiYYUWB5XfYDKlPcezW3QYi9lktGCp2Eqsg+ULX1GD6qIlHySslYlT3kqVZbQb1B5ak416Rq1RMLhUgpsBazuB50jr5I1zfrFdi4UeNlkBWxFcJaGOY8HScCKwvlGU7TqGbjucB1rA3mQhGvSTUmfDeGBnGrLwCdA==
(Got this from using the same data in a non c# non open-source application).

+0

Bitte bearbeiten Sie Ihre Frage und fügen Sie die Fehler hinzu, denen Sie gegenüberstehen. – Dalton

+0

Ich schätze, der Fehler, mit dem Sie konfrontiert sind, bezieht sich auf 'testData' Größe, oder? Testen Sie die Verschlüsselung mit einer kleineren Nur-Text-Zeichenfolge. – Dalton

+0

@Dalton Bearbeitet, und ich habe den Code leicht aktualisiert, der Code war versehentlich versucht, den öffentlichen Schlüssel zu verschlüsseln (war nicht auf meinem Ende, war nur von der Bearbeitung Fehler bei der Frage). Und die testData Zeichenfolge ist wie 7 Zeichen lang – user8549339

Antwort

2

Der öffentliche Schlüssel-String Sie sieht aus wie die hexadezimale Darstellung eines Byte-Array zu mir. Deshalb testete ich es zu einem byte[] mit der folgenden Konvertierung zu konvertieren:

public static byte[] HexStringToByteArray(string hexString) 
{ 
    MemoryStream stream = new MemoryStream(hexString.Length/2); 

    for (int i = 0; i < hexString.Length; i += 2) 
    { 
     stream.WriteByte(byte.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier)); 
    } 
    return stream.ToArray(); 
} 

Auch der Exponent wahrscheinlich hat das gleiche Format (3 Bytes, 0x01 0x00 0x01), deshalb bin ich mit dem gleichen Ansatz zu konvertieren zu einem byte[]

Am Ende sieht der Code wie:

string publicKey = "a383a2916281721498ff28226f851613bab6f89eb0536e9f237e158596d3b012e5707eba9f2a2963faca63fcb10f5de79caf246c1f587ee6e8f895fd848f2da5aba9d71af4dd8d06e99ff3729631626ed3f3202e56962957c0110a99d2b3893feb148291e09b54fe7df121751fb8bb589576542321b4f548be06b9845ebc6bbef1427741c00b632c05854146b597fdef5a89ace1556a769c5eaff8fc0589e7ad4adb2e2a929969c77f395b2f5a276a9389d1f43c061c9459a65b77bcd581c107aa8424223a0b44ee52582362cc96b90eea071a0dda5e9cb8fd5c9fd4ac86e177c07d79071788cb08231240dc1c9169af2629ecec31751069f0c7ccc1c1752303"; 
      string exponant = "010001"; 
      string toEncrypt = "Test123"; 
      using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
      { 
       RSAParameters rsap = new RSAParameters 
       { 
        Modulus = HexStringToByteArray(publicKey), 
        Exponent = HexStringToByteArray(exponant) 
       }; 
       //Tried with and without the whole base64 thing 
       rsa.ImportParameters(rsap); 
       byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(toEncrypt), false); 
       string base64Encrypted = Convert.ToBase64String(encryptedData); 

der Import der RSA-Parameter erfolgreich ist, und die Verschlüsselung zu.

Die Ausgabe sieht wie folgt aus. Es muss nicht das gleiche sein wie Ihres (das Sie mit einer nicht C#, nicht Open Source-Anwendung, auf die Art, mit der ich eine Art von Vorwurf spürte) erzeugt, weil es andere Faktoren wie Padding, die das Ergebnis beeinflussen, aber Die Verschlüsselung ist erfolgreich.

VXg8wRZz7SDnhg3T1GPs8CztjPsGwES+ngJAaBBVMSNkBiBOU+ju70pI5sAjvFS34+ztY8VLUZZ4vzf9 
NkBNCgEn7Q2NezOwgP029yHY169Jc7Kqkwy0UbJLAwCwmqR+/G6B/S2hL2ADV+5EeaEn4ZmmKl/WRp+P 
ruwWKDQx46/ih0itvh7uF5/OfKCqeIrcsqpZgQ4pByNQNOTs1sFlKB+/8TZ6Ey00lYU8c3bRLOef0Nh+ 
uivY0LI2ryOYI//EtmoZqfkeJH2ZqOQPy/I4R/OXHs1RcEZpnam8/OF1c/DlGVp3//RO8owmStxSj/eF 
TD5arc3a1kiNma+/DDQYuQ== 
+0

Funktioniert wie Magie, schätze es: D – user8549339

Verwandte Themen