none
zip Datei mittels P7B und P12 Zertifikate verschlüsseln RRS feed

  • Frage

  • Guten Morgen :-)

    ich soll zip-Archive mittels öffentlichem P7B Schlüssel verschlüsseln und anschließend mittels P12 Zertifikat signieren. 

    Als Eingabedatei erhalte ich also etwas wie Dateiname.zip und als Ausgabe wird erwartet Dateiname.zip.ver.sig

    Bislang konnte ich herausfinden wie ich die P7B und die P12 Datei einlesen aber danach hört es bei mir auf.

      byte[] certBytes = File.ReadAllBytes(p7bFilePath);
    
                SignedCms signedCms = new SignedCms();
                signedCms.Decode(certBytes);

    Eventuell signiere ich bereits mittels P12 ich bin mir nicht ganz im Klaren ob dem wirklich so ist:

    X509Certificate2 cert = new X509Certificate2(p12FilePath, password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
                byte[] certData = cert.Export(X509ContentType.Pfx, password);
                RSACryptoServiceProvider rsaKey = (RSACryptoServiceProvider)cert.PrivateKey;
    
                SHA1Managed sha1 = new SHA1Managed();
                UnicodeEncoding encoding = new UnicodeEncoding();
                byte[] data = encoding.GetBytes(text);
                byte[] hash = sha1.ComputeHash(bytesToEncrypt);
                var sign = rsaKey.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    
    
                var str = System.Text.Encoding.Default.GetString(sign);
    
    
                Console.WriteLine(str);

    Ich habe gelesen, dass mir eventuell auch "Bouncy Castle" bei der Aufgabe helfen könnte aber momentan versuche ich noch alles mit den .net mitgelieferten Mitteln zu lösen.

    Kenn sich hier eventuell jemand besser mit dem Thema aus, dass wäre super, da ich langsam daran "verzweifel"?

    Donnerstag, 8. August 2019 08:19

Antworten

  • Hallo bkreye,

    zum Verschlüsseln erstellst Du einen RSACryptoServiceProvider mithilfe des Key (aus der genannten P7B), etwa so:

    X509Certificate2 cert = new X509Certificate2(X509Certificate2(rawDataFromFile);
    RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;

    diesen nutzt du dann zum Verschlüsseln der Datei (vorher einlesen).

    byte[] encryptedData;
    byte[] dataToEncrypt = // Zuweisung deiner Datei...
    
    encryptedData = RSAEncrypt(dataToEncrypt, rsa.ExportParameters(false), false);

    Wie die Signatur erstellt wird, hast Du selbst schon gefunden, dies dann auf die verschlüsselte Datei anwenden, und noch die Signatur der Datei anfügen, dies muss dann so geschehen, wie es für eure Zwecke definiert wurde (z. B. Anfang oder Ende der Datei).

    Der zweite Codeabschnitt ist der verlinkten Dokumentation entnommen.


    - Gruß Florian





    Donnerstag, 8. August 2019 09:44
  • Vielen Dank für deine Antwort, ich konnte es noch nicht testen aber soweit ich weiß kann ich mittels RSA doch nur kleinere Datenmengen verschlüsseln oder nicht? Die zip wird am ende wahrscheinlich um die 100MB groß werden. 

    Wird eventuell das signieren mittels P7B Datei auch als verschlüsseln angesehen? 

    Signieren ist nicht Verschlüsseln.

    Für die Verschlüsselung größerer Datenmengen sind asymmetrische Verschlüsselungen tatsächlich nicht gedacht, es sollte daher eine symmetrische Verschlüsselung gewählt werden, für den Schlüsselaustausch hingegen wäre ein asymmetrisches Verfahren wieder geeignet.
    Die asymmetrische Verschlüsselung war deine Vorgabe.


    - Gruß Florian


    Freitag, 9. August 2019 09:00

Alle Antworten

  • Hallo bkreye,

    zum Verschlüsseln erstellst Du einen RSACryptoServiceProvider mithilfe des Key (aus der genannten P7B), etwa so:

    X509Certificate2 cert = new X509Certificate2(X509Certificate2(rawDataFromFile);
    RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;

    diesen nutzt du dann zum Verschlüsseln der Datei (vorher einlesen).

    byte[] encryptedData;
    byte[] dataToEncrypt = // Zuweisung deiner Datei...
    
    encryptedData = RSAEncrypt(dataToEncrypt, rsa.ExportParameters(false), false);

    Wie die Signatur erstellt wird, hast Du selbst schon gefunden, dies dann auf die verschlüsselte Datei anwenden, und noch die Signatur der Datei anfügen, dies muss dann so geschehen, wie es für eure Zwecke definiert wurde (z. B. Anfang oder Ende der Datei).

    Der zweite Codeabschnitt ist der verlinkten Dokumentation entnommen.


    - Gruß Florian





    Donnerstag, 8. August 2019 09:44
  • Vielen Dank für deine Antwort, ich konnte es noch nicht testen aber soweit ich weiß kann ich mittels RSA doch nur kleinere Datenmengen verschlüsseln oder nicht? Die zip wird am ende wahrscheinlich um die 100MB groß werden. 

    Wird eventuell das signieren mittels P7B Datei auch als verschlüsseln angesehen? 

    Donnerstag, 8. August 2019 18:16
  • So nun konnte ich das ganze mal testen und habe folgenden Fehler bekommen:

    Der Typ "System.Security.Cryptography.PublicKey" kann nicht in "System.Security.Cryptography.RSACryptoProvider" konvertiert werden. 


    Freitag, 9. August 2019 07:47
  • Vielen Dank für deine Antwort, ich konnte es noch nicht testen aber soweit ich weiß kann ich mittels RSA doch nur kleinere Datenmengen verschlüsseln oder nicht? Die zip wird am ende wahrscheinlich um die 100MB groß werden. 

    Wird eventuell das signieren mittels P7B Datei auch als verschlüsseln angesehen? 

    Signieren ist nicht Verschlüsseln.

    Für die Verschlüsselung größerer Datenmengen sind asymmetrische Verschlüsselungen tatsächlich nicht gedacht, es sollte daher eine symmetrische Verschlüsselung gewählt werden, für den Schlüsselaustausch hingegen wäre ein asymmetrisches Verfahren wieder geeignet.
    Die asymmetrische Verschlüsselung war deine Vorgabe.


    - Gruß Florian


    Freitag, 9. August 2019 09:00
  • So nun konnte ich das ganze mal testen und habe folgenden Fehler bekommen:

    Der Typ "System.Security.Cryptography.PublicKey" kann nicht in "System.Security.Cryptography.RSACryptoProvider" konvertiert werden. 


    Ich habe den Code oben korrigiert.

    - Gruß Florian

    Freitag, 9. August 2019 09:01
  • Vielen Dank Florian,

    leider komme ich einfach nicht zu meinem Ergebnis.

    Ich bin auch schon relativ fest davon überzeugt, dass es mit dem was ich bekommen habe nicht möglich ist.

    Mir wurde mitgeteilt die P7B Datei sei der PublicKey den ich zum verschlüsseln nutze und die P12 Datei sei mein Zertifikat zum signieren. 

    Aber in einer P7B "container" gibt es doch nur RSA Keys und scheinbar auch nur PrivateKeys. Mir ist einfach nicht klar wie diese Dinge ineinander greifen können. 

    Wenn ich versuche aus der P7B Datei ein X509 Zertfikat zu machen bekomme ich momentan die Meldung "System.Security.Cryptography.CryptographicException: "Der ursprüngliche Signaturgeber wurde nicht gefunden."

    Es ist zum Mäuse melken.

    Dienstag, 13. August 2019 10:17
  • Aber in einer P7B "container" gibt es doch nur RSA Keys und scheinbar auch nur PrivateKeys. Mir ist einfach nicht klar wie diese Dinge ineinander greifen können. >

    Wenn ich versuche aus der P7B Datei ein X509 Zertfikat zu machen bekomme ich momentan die Meldung "System.Security.Cryptography.CryptographicException: "Der ursprüngliche Signaturgeber wurde nicht gefunden."

    Ich hatte Dich so verstanden, dass schon klar wäre, wie Du die p7b einliest und verwendest, der CodeAusschnitt mit SignedCMS unterstrich dieses auch.

    Die p7b enthält gerade keine Private Keys, darin enthalten sind die Zertifikate zur Validierung (inkl. deren PublicKeys), also eine Zertifikatskette.

    Wenn Du die p7b in ein SignedCMS Objekt eingelesen hast, dann brauchst Du dieses nur noch nach dem Zertifikat zu fragen, bzw. dieses aus der Collection (Property Certificates) holen.


    - Gruß Florian

    Dienstag, 13. August 2019 11:05
  • Nene, ich habe absolut 0 Ahnung von dem was ich versuche, alle Codeschnipsel die ich so finde probiere ich aus und die oben waren bislang für mein Verständnis der richtigste Ansatz. Man könnte sagen ich McGuyver mir das zusammen ;)


     
    var bla = signedCms.Certificates;            foreach (X509Certificate2 x509 in bla)            {                try                {                    byte[] rawdata = x509.RawData;                    Debug.WriteLine("Content Type: {0}{1}", X509Certificate2.GetCertContentType(rawdata), Environment.NewLine);                    Debug.WriteLine("Friendly Name: {0}{1}", x509.FriendlyName, Environment.NewLine);                    Debug.WriteLine("Certificate Verified?: {0}{1}", x509.Verify(), Environment.NewLine);                    Debug.WriteLine("Simple Name: {0}{1}", x509.GetNameInfo(X509NameType.SimpleName, true), Environment.NewLine);                    Debug.WriteLine("Signature Algorithm: {0}{1}", x509.SignatureAlgorithm.FriendlyName, Environment.NewLine);                    Debug.WriteLine("Public Key: {0}{1}", x509.PublicKey.Key.ToXmlString(false), Environment.NewLine);                    Debug.WriteLine("Certificate Archived?: {0}{1}", x509.Archived, Environment.NewLine);                    Debug.WriteLine("Length of Raw Data: {0}{1}", x509.RawData.Length, Environment.NewLine);                    X509Certificate2UI.DisplayCertificate(x509);                    x509.Reset();                }                catch (CryptographicException)                {                    Console.WriteLine("Information could not be written out for this certificate.");                }

    Das habe ich unter der von der verlinken Seite gefunden und als Ergebnis folgendes bekommen:

    Content Type: Cert

    Friendly Name: Certificate Verified?: False Simple Name: Test Root Zertifikat Signature Algorithm: sha256RSA Public Key: <RSAKeyValue><Modulus>...</Modulus><Exponent>...</Exponent></RSAKeyValue> Certificate Archived?: False Length of Raw Data: 1759


    Wenn ich das nun alles richtig verstehe brauche ich SHA256RSA als meine Verschlüsselungsmethode.


    Mittwoch, 14. August 2019 08:48