Was willst du wann, mit AES verschlüsseln?Fortender schrieb:
Was ich noch machen werde ist, dass ich wie von Trade vorgeschlagen die Keys zur Laufzeit einlese und vorher mit AES256 verschlüssle.
RSA Signierung
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 50 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.
-
-
#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da -
-
EaranMaleasi schrieb:
Ich dachte schon den öffentlichen Schlüssel
Nein. Ich meinte den Private Key natürlich
Die Konstante RSA_KEY kommt dann weg und in den Konstruktor der RsaManager-Klasse kommt als Parameter eben dann rsaKey mit rein.
Der wird dann eben aus einer Datei ausgelesen, die selbstverständlich verschlüsselt ist. Ansonsten hätte das Ganze ja gar keinen Sinn.
Hab den Code in meinem letzten Post mal editiert. -
Noch Anmerkung zum Code-Design:
Das ist ja eine Winz-Klasse! Die Methoden sind ja nur Einzeiler.
Auch hat die Klasse gar keinen veränderlichen Status, also bei sowas würde ich eine statische Klasse nehmen - Objekte zu erstellen ist hier garnet erforderlich.
Das Crypto-Dingens könnte man dann immer neu erstellen und gleich wieder disposen - ist doch dispoable, oder?
Achtung: Dieser Post kann auch als OffTopic aufgefasst werden, und Einstieg sein in eine Diskussion über objektorientierte Programmierung (wann Klasse anlegen, wann statische Klasse)
Also ignoriert ihn lieber, wenn ihr beim Thema bleiben wollt -
@ErfinderDesRades Nein nein, das passt schon! Finde ich angebracht. Ich habe nie richtig objektorientiert programmiert und möchte mir das jetzt aneignen.
der RSACryptoServiceProvider ist Disposable. Um die Klasse statisch zu machen, kann ich dann einfach die Methoden als Public Shared deklarieren? -
Stimmt, @Fortender. Du solltest noch IDisposable implementieren.
Und nichts an Methoden statisch machen. Das mit den Instanzmembern stimmt schon so.
Grüß#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da -
Ich würde gern anfügen das ich @ErfinderDesRades recht gebe, die Klasse verwaltet intern nichts, also warum nicht statisch?
-
Fortender schrieb:
objektorientiert ... aneignen
bei mir ohne Klasse sähe es evtl. so aus:VB.NET-Quellcode
- Imports System.Security.Cryptography
- Public Class RsaManager
- Const RSA_KEY_SIZE = 8192
- Private Sub New() 'Instanzierung verhindern
- End Sub
- Public Shared Function Sign(_data As Byte()) As Byte()
- Using _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- Return _rsa.SignData(_data, GetType(SHA512))
- End Using
- End Function
- Public Shared Function Verify(_data As Byte(), _signature As Byte()) As Boolean
- Using _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- Return _rsa.VerifyData(_data, GetType(SHA512), _signature)
- End Using
- End Function
- End Class
Alternativ käme ein Modul in Frage, in einem eigenen Namespace - so entspräche es den c#-static classes am ehesten.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
@ErfinderDesRades Es fehlt noch das Importieren des Private-Key's
Außerdem dachte ich mir, dass es evtl. besser wäre zu instanzieren, da ich dann nicht dauernd einen RSACryptoServiceProvider anlegen muss und den Key reinladen.
Das kostet nämlich zusätzlich Zeit, laut Trade sogar ein paar Sekunden. Wenn ich wie vorgesehen eine Datei in 1024byte Pakete unterteile und signiere/verifiziere, dann
dauert das viel viel länger als mit meiner Klasse. Bin ich mir ziemlich sicher.
VB.NET-Quellcode
- Imports System.Security.Cryptography
- Public Class RsaManager
- Const RSA_KEY_SIZE = 8192
- Public Shared Function Sign(_data As Byte(), _rsaKey As String) As Byte()
- Using _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- _rsa.FromXmlString(_rsaKey)
- Return _rsa.SignData(_data, GetType(SHA512))
- End Using
- End Function
- Public Shared Function Verify(_data As Byte(), _signature As Byte(), _rsaKey As String) As Boolean
- Using _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- _rsa.FromXmlString(_rsaKey)
- Return _rsa.VerifyData(_data, GetType(SHA512), _signature)
- End Using
- End Function
- End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fortender“ ()
-
Wenn man den RsaCryptoServiceProvider global in der Klasse anlegt, was man normal macht, dann verwaltet die Klasse sehr wohl intern was. Dazu kommt ein Flag für's Disposen.
Zudem braucht man zwei Konstruktoren, einen für das Angeben eines Keys und einen ohne, um Schlüssel zu generieren.
Es fehlen auch entsprechende Properties.
Grüße#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da -
Ja, wenn Gründe dafür vorliegen, macht mans natürlich als Klasse.
Man kanns sogar auch ohne Gründe als Klasse machen, auch im Framework gibts glaub einige Klassen die eigentlich gar keine Statusse haben, und im INet finden sich glaub noch viel mehr Beispiele, wo professionelle Coder den Ansatz Klasse gewählt haben, auch wenn er eiglich verzichtbar gewesen wäre.
Ich bin da vlt. kleinlich, ich lege Klassen nur an, wenn ich sie auch wirklich brauche.
Also ich bin hier zufrieden, der Gedanke ist glaub verstanden.
Man könnte noch den Singleton-Pattern anbringen, dann hätte man 3 Pattern nebeneinandergestellt, mit denen man den hiesigen Concern abhandeln könnte.
Aber halt nur, wenn der RsaManager wirklich nicht mehr zu tun hat, als hier gezeigt ist. Kommen Gründe hinzu, die eine richtige Klasse erfordern, dann sind die anneren beiden Pattern halt draussen (Singleton ist hier imo eh weniger dolle als Static Class).
-
Hab es jetzt mal erweitert und IDisposable implementiert.
VB.NET-Quellcode
- Imports System.Security.Cryptography
- Public Class RsaManager : Implements IDisposable
- Const RSA_KEY_SIZE = 8192
- Private _rsa As RSACryptoServiceProvider
- Private disposed As Boolean = False
- Public Sub New(rsaKey As String)
- _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- _rsa.FromXmlString(rsaKey)
- End Sub
- Public Sub New()
- _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- End Sub
- Public ReadOnly Property PublicKey As String
- Get
- Return _rsa.ToXmlString(False)
- End Get
- End Property
- Public ReadOnly Property PrivateKey As String
- Get
- Return _rsa.ToXmlString(True)
- End Get
- End Property
- Public Function Sign(_data As Byte()) As Byte()
- Return _rsa.SignData(_data, GetType(SHA512))
- End Function
- Public Function Verify(_data As Byte(), _signature As Byte()) As Boolean
- Return _rsa.VerifyData(_data, GetType(SHA512), _signature)
- End Function
- Public Sub Dispose() Implements IDisposable.Dispose
- Dispose(True)
- GC.SuppressFinalize(Me)
- End Sub
- Protected Overridable Sub Dispose(disposing As Boolean)
- If disposed Then Return
- If disposing Then
- _rsa.Dispose()
- End If
- disposed = True
- End Sub
- End Class
-
Wenn Du einen Key angibst, dann brauchst Du keine Size angeben.
Hier noch mein Lösung (C#):
Sieht aber gut aus. Rufe noch im Konstruktor für die Generierung_rsa.ToXmlString(True)
auf, dann wird das gleich generiert und nicht erst, wenn Du die Property aufrufst.
Grüße#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum daDieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()
-
Naja.. ich finde den RsaCryptoServiceProvider kann man auch einfach so verwenden. Aber gut jetzt b2t.
-
Danke
Hier nochmal das Update des Codes:
VB.NET-Quellcode
- Imports System.Security.Cryptography
- Public Class RsaManager : Implements IDisposable
- Const RSA_KEY_SIZE = 8192
- Private _rsa As RSACryptoServiceProvider
- Private disposed As Boolean = False
- Public Sub New(rsaKey As String)
- _rsa = New RSACryptoServiceProvider() With {.PersistKeyInCsp = False}
- _rsa.FromXmlString(rsaKey)
- End Sub
- Public Sub New()
- _rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- _rsa.ToXmlString(True)
- End Sub
- Public ReadOnly Property PublicKey As String
- Get
- Return _rsa.ToXmlString(False)
- End Get
- End Property
- Public ReadOnly Property PrivateKey As String
- Get
- Return _rsa.ToXmlString(True)
- End Get
- End Property
- Public Function Sign(_data As Byte()) As Byte()
- Return _rsa.SignData(_data, GetType(SHA512))
- End Function
- Public Function Verify(_data As Byte(), _signature As Byte()) As Boolean
- Return _rsa.VerifyData(_data, GetType(SHA512), _signature)
- End Function
- Public Sub Dispose() Implements IDisposable.Dispose
- Dispose(True)
- GC.SuppressFinalize(Me)
- End Sub
- Protected Overridable Sub Dispose(disposing As Boolean)
- If disposed Then Return
- If disposing Then
- _rsa.Dispose()
- End If
- disposed = True
- End Sub
- End Class
-
ich probier nu auch mal mit rum, hab ich gleich erste Frage zu: Rsa-Cryptoprovider-Performance
/OffTopic
-
guck, derzeitiger Stand meiner Übungen:
VB.NET-Quellcode
- Public Module RsaSignature
- Const RSA_KEY_SIZE = 512
- 'Const RSA_KEY_SIZE = 8192 'high security-level causes Durations of CspBlob-Creating about half a minute
- Public Sub CreateCspBlobs(ByRef privateCsp As Byte(), ByRef publicCsp As Byte())
- Using rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- privateCsp = rsa.ExportCspBlob(True)
- publicCsp = rsa.ExportCspBlob(False)
- End Using
- End Sub
- Public Function CreateSignature(data As Byte(), privateCspBlob As Byte()) As Byte()
- Using rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- rsa.ImportCspBlob(privateCspBlob)
- Return rsa.SignData(data, GetType(SHA1))
- End Using
- End Function
- Public Function VerifyData(data As Byte(), signature As Byte(), publicCspBlob As Byte()) As Boolean
- Using rsa = New RSACryptoServiceProvider(RSA_KEY_SIZE) With {.PersistKeyInCsp = False}
- rsa.ImportCspBlob(publicCspBlob)
- Return rsa.VerifyData(data, GetType(SHA1), signature)
- End Using
- End Function
- End Module
Zu Verwenden ist das einerseits beim Sender, der generiert sich CryptoServiceProviderParameterBlobs (#7,#8). Das sind Byte-Arrays, mit denen man son RSA-Dingens quasi serialisieren kann, also abspeichern, verschicken, und woanders kann man 1:1 den CSP daraus wieder rekonstruieren (.ImportCspBlob(blob)
, #7, #14), inklusive Einstellungen und auch des Public/Private-Keys vom RSA.
Und der Sender generiert sich beide Blobs, für Privat zum signieren, und für Public zum Verifizieren.
Der Public CryptoServiceProviderParameterBlob muss dem Empfänger mitgeteilt sein, auf anderem Wege, als wie er letztlich die Nachrichten bekommt.
Dann kann man-in-the-middle nur die Daten und ihre Signaturen verändern, aber damit fliegt er ja auf, denn er kann ja nicht den Public-CryptoServiceProviderParameterBlob im Empfänger verändern, mit dem verifiziert wird
Jo, als TestCode habich solch verzapft:VB.NET-Quellcode
- Private Sub btTest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btTest.Click
- 'data-sender-side
- Dim publicCsp As Byte() = Nothing 'publicCsp, to be shipped to Receivers
- Dim privateCsp As Byte() = Nothing 'stays at sender, to sign data
- RsaSignature.CreateCspBlobs(privateCsp, publicCsp)
- Dim data = New Byte() {1, 2, 3, 4, 5, 6}
- Dim signature = RsaSignature.CreateSignature(data, privateCsp)
- ''man in the middle-manipulation:
- 'data(4) = 9
- 'signature(20) = 8
- ''data-receiver-side
- Dim isValid = RsaSignature.VerifyData(data, signature, publicCsp)
- Call (If(isValid, System.Media.SystemSounds.Asterisk, System.Media.SystemSounds.Hand)).Play()
- End Sub
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
-
-
Ähnliche Themen
-
6 Benutzer haben hier geschrieben
- Fortender (13)
- ErfinderDesRades (13)
- Trade (10)
- EaranMaleasi (7)
- ThuCommix (4)
- Gast (4)