Mein erstes C# Projekt - Secure Array und List

    • Release
    • Closed Source

    Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

      Mein erstes C# Projekt - Secure Array und List

      Hallo Community

      Habe mein erstes kleines Projekt in C# gemacht.

      Ich wusste zuerst nicht wirklich was ich genau machen werde. Hab mich dann für ein einfacheres entschieden.

      Und zwar für eine dynamische Array und eine dafür passende Liste, basierend auf den primitiven Datentypen. Beide sind generisch aufgebaut, und waren daher auch eine kleine Herausforderung.

      Die Umstellung auf C# empfand ich erstaunlicherweise nicht so belastend. Schon nach wenigen Stunden hab ich nur noch in C# gedacht, und der Lernerfolg war sehr gross.



      Das Projekt SecureListOfT




      SecureArray<T>

      SecureArrayOfT ist wie eine Liste, mit einer internen Array. Es verwaltet den benötigten Speicher (Allokation) komplett selber. Anderseits können Einstellungen (gilt auch für SecureListOfT) über zwei entscheidende Properties gemacht werden.


      Capacity

      Gibt die reale Länge der internen Array aus. Es kann auf Wunsch höher oder tiefer gesetzt werden. Die Kapazität kann aber nicht unter die Arbeitslänge (Bereich, mit der gearbeitet wird) gewählt werden. Der Arbeitsbereich ist quasi geschützt und SecureArrayOfT übernimmt bei unterschreiten der Kapazität eine eigene Wahl für die optimale Kapazität.
      Möchte man die Kapazität exakt der Arbeitslänge anpassen, kann das mit der Methode TrimExcess() bewerkstelligt werden.


      CapacityStep (Default = 10)

      Ist ein Wert der bei jeder "Relocation" auf die Arbeitslänge hinzugerechnet wird. Wenn also die Kapazität z.B. 20 ist, und es werden weitere 30 Werte der internen Array hinzugefügt, rechnet SecureArrayOfT zuerst die benötigte Arbeitslänge aus, und zählt am Schluss noch den CapacityStep dazu, damit beim Hinzufügen von einzelnen Zahlen nicht immer gleich eine Relocation eingeleitet werden muss.
      Auch der CapacityStep kann verändert werden. Der minimale CapacityStep bleibt jedoch 10.


      Jedes SecureArrayOfT hat seinen eigenen Schlüsselsatz. Werden also zwei SecureArrayOfT instanziert, besitzt die interne Array auch wenn beide SecureArrayOft die gleichen Zahlen verwalten komplett andere Werte. Die Verschlüsselung ist sehr stark und man kann sich aus den Zahlen der internen Array keinen Reim machen wie die RealZahlen nun wirklich sind.

      Da die Vercryptung seine Zeit benötigt, habe ich für SecureArrayOfT viele kleine Methoden hinzugefügt, die das Hinzufügen und Entfernen beschleunigen. Also statt das vielen einzelnen Werte hinzugefügt werden, können auch Arrays hinzugefügt werden. Das bietet die Möglichkeit, dass nur einmal Ent- bzw. Vercryptet werden muss.

      Die Daten einer SecureArrayOfT können passwortgeschützt abgespeichert werden.



      SecureList<T>

      SecureListOfT ist eine Powerliste nur für SecureArrayOfT. Es arbeitet komplett referenziert, besitz aber wenige Methoden die trotzdem die SecureArrayOfT neu instanzieren (mit Allokation), wie z.B. der Contructor, InitNew, Copy... etc.

      SecureListOfT besitzt eine eigene RandomShuffel sowie eigene SortierungsMethoden die sehr schnell sind. Auch SecureListOfT besitzt die Möglichkeit die komplette Liste passwortgeschützt abzuspeichern.




      Es liegen ausführliche und zum Teil kommentierte UnitTests (in Vb.Net) für beide Werkzeuge dabei. Sie zeigen auch die richtige Anwendung und auf was geachtet werden muss, wenn man mit diesen Werkzeugen arbeitet.

      Kommentare, Fragen und Verbesserungshinweise immer gerne willkommen.

      Viel Spass beim Testen.

      Freundliche Grüsse

      exc-jdbi


      Hier noch die wichtigsten Eckdaten:


      Name:
      SecureListOfT

      Bestehend aus:

      - SecureArrayOfT
      - SecureListOfT

      Beschreibung:
      Generische dynamische Array mit intern vercrypteter Array und dazu passend eine generische Liste

      Screenshot(s):
      Klassendiagramm siehe oben.

      Verwendete Programmiersprache(n) und IDE(s):
      Projekt: VS 2017 - FW 4.7.1 - C# 7.3
      UnitTest: VS 2017 - FW 4.7.1 - VB.NET

      Systemanforderungen - Binary:
      VS 2017 - FW 4.7.1 - Release 32

      Downloads:
      Das Projekt gibt es nur als Binary.
      - Release 32 - VS 2017 - FW 4.7.1 - C# 7.3
      - Die UnitTests als Source beiliegend.
      >> Projekt ist beiliegend als Zip downloadbar.

      Lizenz/Weitergabe:
      Freeware; Closed und OpenSource

      Anmerkung:
      Obwohl Closed, darf bezugnehmend auf den Code der mit einem IL-Converter jederzeit angeschaut werden
      kann, für weitere Dialoge im Forum wie Anmerkungen, Vorschläge etc. verwendet werden.

      Infos für die Umsetzung:
      vb-paradise.de
      stackoverflow.com
      docs.microsoft.com




      Dateien
      • Source.zip

        (55,46 kB, 184 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „exc-jdbi“ ()

      Habe gerade keine richtige Gelegenheit mir das richtig anzugucken, daher kurze Frage vorweg: Liege ich richtig damit, dass die Elemente im Array verschlüsselt im Arbeitsspeicher liegen?
      Grüße

      Addendum: Warum nur als Binary? Ist doch Sourcecode-Austausch.
      Und Gott alleine weiß alles am allerbesten und besser.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „φConst“ ()

      Guten Morgen @φConst

      Danke für's reinschauen.

      Ja die Werte in der internen Array (und somit auch im Arbeitsspeicher) werden jeweils nach Änderung mit einer OTP verschlüsselt. Es wird aber nicht die ganze Array verschlüsselt, sondern nur jeweils der Arbeitsbereich der internen Array. Der Rest ist sich selber überlassen, und ist daher meistens mit 0-Werten gefüllt.

      Für das Abspeichern auf die HDD wird ein AES-Verfahren (mit Benutzerpasswort) als Verschlüsselung verwendet.

      Das Projekt ist Open-Source. Reinschauen kann man ja trotzdem. Der IL-Converter gibt den Code wie ich gesehen habe ziemlich gut her.


      Freundliche Grüsse

      exc-jdbi

      exc-jdbi schrieb:


      Ja die Werte in der internen Array (und somit auch im Arbeitsspeicher) werden jeweils nach Änderung mit einer OTP verschlüsselt.


      Und der Schlüssel zur Rekonstruktion des originalen Strings liegt wo?
      Grüße.
      '
      Und Gott alleine weiß alles am allerbesten und besser.
      Hallo @φConst

      Ich nehme jetzt an, du beziehst dich mit deiner Frage nur auf die Kerntätigkeit von SecureArrayOfT. Also ohne das Abspeichern auf die HDD.

      Es gibt eine Klasse CryptoSet die bei jeder Neu-Initialisierung von SecureArrayOfT auch neu instanziert wird. Die Klasse CryptoSet hält eine Instanz der Klasse Key_Set (wird von Intellisence nicht angezeigt, da beide Internal sind. Die Variable ist auch mit [Browsable(false)] gekennzeichnet), die wie der Name sagt für das generieren eines SchlüsselSets für das OTP zuständig ist. Die Schlüssel werden zufällig erstellt (RandomNumberGenerator). Nebst mehreren Schlüssel (Byte-Arrays), werden auch noch ein paar andere Parameter zufällig erstellt. Alles zusammen nenn ich jetzt einfach mal KeySet. (Übrigends: Mein IL-Converter Auswahl C# zeigt mir die Klasse CryptoSet/Key_Set quasi 1 zu 1 wie geschrieben)

      Bei jeder VERCryptung wird ein komplett neuer KeySet erstellt, der natürlich für die nächste ENTCryptung nochmals gebraucht wird.

      >> KeySet generieren, vercrypten, entcrypten >> KeySet generieren, vercrypten, entcrypten etc.

      Ich hoffe das beantwortet deine Frage.

      Freundliche Grüsse

      exc-jdbi

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

      Es läuft darauf hinaus, dass schlussendlich der Schlüssel im Klartext im Arbeitsspeicher liegt. Jemand der an die Daten rankommen will, wird es', daher ist das eher ein "Bottleneck" so einen Array zu nutzen.

      Grüße
      Und Gott alleine weiß alles am allerbesten und besser.