Elegant IPB Skin By Skinbox

.NET Base: Eine Seriennummer für einen Namen generieren - .NET Base

Zum Inhalt wechseln

Seite 1 von 1
  • Du kannst kein neues Thema erstellen
  • Antworten nicht möglich

Eine Seriennummer für einen Namen generieren Unique Seriennummern mit Hashing und GUID-Fielding

Geschrieben 17. Sep 2009 - 15:00 (#1) Mitglied ist offline   Dennis Alexander 

  • Administrator
  • Blog anzeigen
  • Gruppe: Administratoren
  • Beiträge: 533
  • Registriert: 09. Sep. 09
  • Wohnort: Bad Essen
  • OS: Windows 7 Prof.
  • IDE: Visual Studio 2010 Ultimate

Seit gestern hat mich wieder die Aktivierung einer eigenen Anwendung gereizt, und ich habe gestern zwei Methoden entwickelt, die eine zufalls Seriennummer generieren. Die eine Methode erzeugt durch die Parameter "Länge und Blocksize" automatisch eine einfache Seriennummer, die andere Methode setzt auf eine eigene Maske (bspw: AAAA-0a-Aaaa) um eine Seriennummer zu erzeugen.

Dies ist zwar ganz schön, aber es hilft uns nicht wirklich für eine sinnvolle Überprüfung der Kombination. Deshalb habe ich mir heute morgen und den Tag über überlegt, wie man eine "relativ" sichere Überprüfung des Namen und der Seriennummer realisieren kann. Resultat ist dieser Artikel.

Unser "fertiges" Ergebnis wird später so aussehen und technisch ziemlich was unter der "Haube" haben:

Eingefügtes Bild

Bei vielen Anwendungen setzen die Entwickler auf eine "schnelle" Benutzername/Seriennummer Kombination, was meistens bewirkt, das binnen weniger Tage ein entsprechender KeyGen für die Anwendung verfübar ist. Dies ist natürlich nicht wirklich Sinn der Sache, deswegen sollte man - aus meiner Sicht - schon einen relativen Aufwand fahren um es wenigstens zu erschweren. Verhindern kann man es logischerweise nie. Es gibt bis auf Software-/Hardware bzw. Software->Webdatenbank/Hardware-Lösungen keine 100% sicheren Lösungen. (Und auch diese sind nich 100%ig, aber sind in vielen Fällen soaufwendig das es viel zu viel Zeit oder zuviel Rechenleistung benötigt, diese auszuhebeln)

Lediglich versuchen wir es den Crackern nur schwer zu machen, sodass diese viel zu viel Zeit benötigen und dadurch entweder die verschlüsselte Information "abgelaufen" bzw. "verfallen" ist, oder eine neue Version mit einem neuen Mechanis erschienen ist. Um dies jedoch zu realisieren ist eine ausgefeilte Logik und gute Verschlüsselungsroutinen nötig.

Dies war auch der Ansatzpunkt meiner Methode. Sie sollte für den Anwender leicht zu implementieren sein, aber dennoch (für eine kostenlose Komponente) einen guten Schutz bieten. Das beste ist natürlich diese nicht offen preiszugeben, da dies ein großer Angriffspunkt ist, aber man kann diese an sehr vielen Stellen sehr gut abändern bzw. mit weiteren Mechanismen erweitern.


Funktionsweise & Parameter


Es werden mehrere Parameter benötigt, um die Funktion generateSerialNumber() aufzurufen:

  • userName <- das ist bspw. der Name des Lizenznehmers (Max Mustermann)
  • saltBytes <-- ein zusätzliche Sicherung: eine zufällige Byte-Folge zum Salten der Verschlüsselung. (Muss logischerweise beim Generieren und beim Überprüfen gleich sein) [4-8 byte]
  • useFields <-- Ein Integer-Array, welches bestimmte Zeichen aus dem generierten Hash für die Seriennummer nutzt.

Sollten diese Informationen vorhanden sein, arbeitet der Generator wie folgt:

  • Generiert ein Byte-Array mit Name und dem Salt
  • Hasht das Byte-Array mit SHA512
  • Konvertiert das Byte-Array zu einem String
  • Entfernt Sonderzeichen
  • nutzt die Fields um die Seriennummer zu erzeugen

Um das ganze Anschließend zu Überprüfen, nutzen wir die Methode validateSerialNumber(). Auch diese nutzt Parameter:

  • userName <- das ist bspw. der Name des Lizenznehmers (Max Mustermann)
  • Serial <-- eingegebene Seriennummer des Benutzers
  • saltBytes <-- ein zusätzliche Sicherung: eine zufällige Byte-Folge zum Salten der Verschlüsselung. (Muss logischerweise beim Generieren und beim Überprüfen gleich sein) [4-8 byte]
  • useFields <-- Ein Integer-Array, welches bestimmte Zeichen aus dem generierten Hash für die Seriennummer nutzt.
Die Logik dieser Methode:

  • Generieren des Hashs des eingegebene Benutzernamens
  • Vergleiche Ergebnis mit der eingegebene Seriennummer

Nun, wofür sind die Fields eigentlich?

Die Fields sind bestimmte Angaben, welche Elemente die Methode aus dem bereinigten String nutzen soll, um damit eine Seriennummer zu bauen. Wenn man bspw {0,1,2,3,4} nutzt, nimmt er die ersten 5 Elemente des bereinigten Strings. bspw "ABK5A".

Das Problem dabei ist, das auch diese Angabe bei der Generierung und der Überprüfung gleichen sein müssen. Ich habe deshalb eine Methode geschrieben (generateFieldsFromGUID()), die die Guid der Anwendung nutzt, um daraus automatisch Fields zu generieren. Dieses Verfahren ist deshalb so interessant, weil jede Guid einer Anwendung sich komplett unterscheidet und aus einer anderen Guid ganz andere Fields generiert werden. Eine Guid unterstützt lediglich 20 native Fields, die restlichen werden durch einen kleinen Algorithmus dazugerechnet. Es werden so bis zu 50-Zeichen lange Seriennummern generiert.

Ich denke dies sollte ausreichend sein.


Ich hoffe ich kann damit dem ein oder anderen einen Denkanstoß vermitteln. Es lassen sich noch viele weitere Mechanismen integrieren - experimentiert etwas herum!

Im Anhang findet ihr die oben vorgestellte Anwendung (nur zum Testen als .exe-Datei).


Der Aufruf:


Visual C#
 // Aufruf ohne Field-Generator:
 byte[] mySalt = { 104, 255, 12, 132, 91, 254, 29 };
 int[] myFields = new int[] { 10, 29, 41, 58, 80, 45, 31, 23, 74, 42 };

 // Generieren der Seriennummer
 string generierteSeriennummer = generateSerialNumber("Name", mySalt, myFields);

 // Überprüfen der Seriennummer
 bool serialIsValid = validateSerialNumber("Name", generierteSeriennummer, mySalt, myFields);


 // Aufruf MIT Field-Generator
 byte[] mySalt = { 104, 255, 12, 132, 91, 254, 29 };
 int[] myFields = generateFieldsFromGUID(10); // Seriennummer soll 10 Zeichen lang sein

 // Generieren der Seriennummer
 string generierteSeriennummer = generateSerialNumber("Name", mySalt, myFields);

 // Überprüfen der Seriennummer
 bool serialIsValid = validateSerialNumber("Name", generierteSeriennummer, mySalt, myFields);


Die Methoden:


Visual C#
 /// <summary>
 /// Generiert eine Seriennummer für einen bestimmten Namen
 /// © Dennis Alexander Petrasch, dotnetBase.de
 /// </summary>
 /// <param name="userName">Benutzername</param>
 /// <param name="saltBytes">4 oder 8 Salt-Byte-Array</param>
 /// <param name="useFields">Hashelemente für Seriennummer</param>
 /// <returns>gibt die Seriennummer zurück</returns>
 public static string generateSerialNumber(string userName, byte[] saltBytes, int[] useFields)
 {
 // Wir konvertieren den Username in ein byte-Array
 byte[] userNameBytes = Encoding.UTF8.GetBytes(userName);

 // Erzeugen ein Byte-Array der Länge Username + Salt
 byte[] userNameWithSaltBytes = new byte[userNameBytes.Length + saltBytes.Length];

 // Kopieren den Usernamen in unser Byte-Array
 for (int i = 0; i < userNameBytes.Length; i++)
 {
 userNameWithSaltBytes[i] = userNameBytes[i];
 }

 // Hängen unseren Salt an
 for (int i = 0; i < saltBytes.Length; i++)
 {
 userNameWithSaltBytes[userNameBytes.Length + i] = saltBytes[i];
 }

 // Erzeugen einen neuen SHA384 HashProvider
 HashAlgorithm shaCrypto = new SHA512Managed();

 // Erzeugen einen Hash von unserem Usernamen + Salt
 byte[] hashBytes = shaCrypto.ComputeHash(userNameWithSaltBytes);

 // Erzeugen ein Byte-Array für den Hash und den Salt
 byte[] hashWithSaltBytes = new byte[hashBytes.Length +
 saltBytes.Length];

 // Kopiere den Hash in unser Byte-Array
 for (int i = 0; i < hashBytes.Length; i++)
 hashWithSaltBytes[i] = hashBytes[i];

 // Kopiere den Salt ebenfalls in das Byte Array
 for (int i = 0; i < saltBytes.Length; i++)
 hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

 // Konvertiere unser Byte-Array zu einem String
 string hashValue = Convert.ToBase64String(hashWithSaltBytes);

 // Entferne Sonderzeichen und Kleinschreibung
 hashValue = hashValue.Replace("/", "").Replace("-", "").Replace("+", "");
 hashValue = hashValue.Replace("=", "");
 hashValue = hashValue.ToUpper();

 string serialNumber = "";

 // Lese bestimtme Zeichen aus
 foreach (int i in useFields)
 {
 serialNumber += hashValue[i];
 }

 // Gebe den Wert zurück
 return serialNumber;

 }

 /// <summary>
 /// Überprüf die eingegebene Seriennummer mit der originalen
 /// © Dennis Alexander Petrasch, dotnetBase.de
 /// </summary>
 /// <param name="userName">Benutzername</param>
 /// <param name="Serial">eingegebene Seriennummer</param>
 /// <param name="saltBytes">4 oder 8 Salt-Byte-Array</param>
 /// <param name="useFields">Hashelemente für Seriennummer</param>
 /// <returns>true wenn die Eingaben korrekt sind, ansonsten false</returns>
 public static bool validateSerialNumber(string userName, string Serial, byte[] saltBytes, int[] useFields)
 {
 // Generieren Seriennummer und vergleiche
 string expectedSerial = generateSerialNumber(userName, saltBytes, useFields);

 // Gebe das Resultat des Vergleichs zurück
 return (Serial == expectedSerial);
 }


 /// <summary>
 /// Generiert bis zu 50 Fields anhand der GUID
 /// © Dennis Alexander Petrasch, dotnetBase.de
 /// </summary>
 /// <param name="length">Anzahl der Zeichen der Seriennummer (max. 50)</param>
 /// <returns></returns>
 public static int[] generateFieldsFromGUID(int length)
 {
 // Erzeuge Arrays und einen Counter
 byte[] acceptedValues = new byte[32];
 int[] resultArray = new int[length];
 int counter = 0;

 // Guid Auslesen
 object[] assemblyObjects = System.Reflection.Assembly.GetEntryAssembly().GetCustomAttributes(
 typeof(System.Runtime.InteropServices.GuidAttribute), true);

 byte[] guid = Encoding.UTF8.GetBytes(
 new Guid(((System.Runtime.InteropServices.GuidAttribute)assemblyObjects[0]).Value).ToString("N"));

 
 // Durchsuche Guid nach akzeptablen Fields
 foreach (byte b in guid)
 {
 if (b <= 96)
 {
 if (counter < length)
 {
 // Field gefunden, füge der Liste hinzu
 resultArray[counter] = b;
 counter += 1;
 } 
 }
 }

 // Sollten die Zeichen aus der Guid nicht reichen, erzeugen wir weitere
 if (counter != length)
 {
 for (int i = counter; i != length; i++)
 {
 // Wir generieren neue dazu
 if (resultArray[i - 1] + 1 <= 96)
 {
 resultArray[i] = resultArray[i - 1] + 1;
 }
 else
 {
 resultArray[i] = resultArray[i - 5] - 10;
 }
 }
 }

 // Gebe die generierten Fields zurück
 return resultArray;
 }


Angehängte Datei(en)


Eingefügtes Bild
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.” – Rich Cook
0

Geschrieben 17. Sep 2009 - 15:06 (#2) Mitglied ist offline   HyperteX 

  • Profi
  • Blog anzeigen
  • Gruppe: Supermoderatoren
  • Beiträge: 521
  • Registriert: 10. Sep. 09
  • Wohnort: Karlsruhe - Erde
  • OS: Windows 7
  • IDE: Visual Studio 2008

Auf dem Screenshot steht "Generierite Fields aus der Guid" ;)
Ich kann alles, außer VB.NET
0

Geschrieben 17. Sep 2009 - 15:18 (#3) Mitglied ist offline   Dennis Alexander 

  • Administrator
  • Blog anzeigen
  • Gruppe: Administratoren
  • Beiträge: 533
  • Registriert: 09. Sep. 09
  • Wohnort: Bad Essen
  • OS: Windows 7 Prof.
  • IDE: Visual Studio 2010 Ultimate

Beitrag anzeigenHyperteX sagte am 17. September 2009 - 16:06:

Auf dem Screenshot steht "Generierite Fields aus der Guid" ;)


Jap, ich hatte die Funktionen etwas umgeschrieben um auch an die anderen Informationen zu kommen, einen Screenshot gemacht und dann alles Rückgänig gemacht, um den Aufruf zu schreiben.

Habs bei der Vorschau auch gesehen, aber ich dachte mir den Aufwand machste dir jetzt nicht nochmal ;).

Ich hoffe es ist entschuldbar ;)
Eingefügtes Bild
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.” – Rich Cook
0

Geschrieben 23. Feb 2010 - 16:50 (#4) Mitglied ist online   raupy 

  • Interessierter
  • PIPPIP
  • Blog anzeigen
  • Gruppe: Mitglieder
  • Beiträge: 45
  • Registriert: 04. Feb. 10
  • Wohnort: Ort OrtInDerNäheVonHannover; | Dim OrtInDerNäheVonHannover As New Ort
  • OS: Windows XP Professional
  • IDE: Visual Studio 2010 Ultimate + 2008 Standard(Könnte mir auch per MSDNAA Pro holen)

Ich habe das mal in VB.NET übersetzt und wollte es ein bisschen erweitern, aber beim Checker kommt immer Serial falsch obwohl das der Gerade generierte ist oô.

Hier mein Code:

Form1.vb:

Visual Basic.NET
Imports System.Text
Imports System.Security.Cryptography


Public Class Form1

	'generateSerialNumber und alle zugehörigen Funktionen sind © Dennis Alexander Petrasch, dotnetBase.de
	'SerialNummerGenerieren und SerialNummerÜberprüfen sind © Maximilian Böther, dotnetBase.de

	''' <summary>
	''' Generiert eine Seriennummer für einen bestimmten Namen
	''' </summary>
	''' <param name="userName">Benutzername</param>
	''' <param name="saltBytes">4 oder 8 Salt-Byte-Array</param>
	''' <param name="useFields">Hashelemente für Seriennummer</param>
	''' <returns>gibt die Seriennummer zurück</returns>
	Public Shared Function generateSerialNumber(ByVal userName As String, ByVal saltBytes As Byte(), ByVal useFields As Integer()) As String
 	' Wir konvertieren den Username in ein byte-Array
 	Dim userNameBytes As Byte() = Encoding.UTF8.GetBytes(userName)

 	' Erzeugen ein Byte-Array der Länge Username + Salt
 	Dim userNameWithSaltBytes As Byte() = New Byte(userNameBytes.Length + (saltBytes.Length - 1)) {}

 	' Kopieren den Usernamen in unser Byte-Array
 	For i As Integer = 0 To userNameBytes.Length - 1
 	userNameWithSaltBytes(i) = userNameBytes(i)
 	Next

 	' Hängen unseren Salt an
 	For i As Integer = 0 To saltBytes.Length - 1
 	userNameWithSaltBytes(userNameBytes.Length + i) = saltBytes(i)
 	Next

 	' Erzeugen einen neuen SHA384 HashProvider
 	Dim shaCrypto As HashAlgorithm = New SHA512Managed()

 	' Erzeugen einen Hash von unserem Usernamen + Salt
 	Dim hashBytes As Byte() = shaCrypto.ComputeHash(userNameWithSaltBytes)

 	' Erzeugen ein Byte-Array für den Hash und den Salt
 	Dim hashWithSaltBytes As Byte() = New Byte(hashBytes.Length + (saltBytes.Length - 1)) {}

 	' Kopiere den Hash in unser Byte-Array
 	For i As Integer = 0 To hashBytes.Length - 1
 	hashWithSaltBytes(i) = hashBytes(i)
 	Next

 	' Kopiere den Salt ebenfalls in das Byte Array
 	For i As Integer = 0 To saltBytes.Length - 1
 	hashWithSaltBytes(hashBytes.Length + i) = saltBytes(i)
 	Next

 	' Konvertiere unser Byte-Array zu einem String
 	Dim hashValue As String = Convert.ToBase64String(hashWithSaltBytes)

 	' Entferne Sonderzeichen und Kleinschreibung
 	hashValue = hashValue.Replace("/", "").Replace("-", "").Replace("+", "")
 	hashValue = hashValue.Replace("=", "")
 	hashValue = hashValue.ToUpper()

 	Dim serialNumber As String = ""

 	' Lese bestimtme Zeichen aus
 	For Each i As Integer In useFields
 	serialNumber += hashValue(i)
 	Next

 	' Gebe den Wert zurück

 	Return serialNumber
	End Function

	''' <summary>
	''' Überprüf die eingegebene Seriennummer mit der originalen
	''' </summary>
	''' <param name="userName">Benutzername</param>
	''' <param name="Serial">eingegebene Seriennummer</param>
	''' <param name="saltBytes">4 oder 8 Salt-Byte-Array</param>
	''' <param name="useFields">Hashelemente für Seriennummer</param>
	''' <returns>true wenn die Eingaben korrekt sind, ansonsten false</returns>
	Public Shared Function validateSerialNumber(ByVal userName As String, ByVal Serial As String, ByVal saltBytes As Byte(), ByVal useFields As Integer()) As Boolean
 	' Generieren Seriennummer und vergleiche
 	Dim expectedSerial As String = generateSerialNumber(userName, saltBytes, useFields)

 	' Gebe das Resultat des Vergleichs zurück
 	Return (Serial = expectedSerial)
	End Function


	''' <summary>
	''' Generiert bis zu 50 Fields anhand der GUID
	''' </summary>
	''' <param name="length">Anzahl der Zeichen der Seriennummer (max. 50)</param>
	''' <returns></returns>
	Public Shared Function generateFieldsFromGUID(ByVal length As Integer) As Integer()
 	' Erzeuge Arrays und einen Counter
 	Dim acceptedValues As Byte() = New Byte(31) {}
 	Dim resultArray As Integer() = New Integer(length - 1) {}
 	Dim counter As Integer = 0

 	' Guid Auslesen
 	Dim assemblyObjects As Object() = System.Reflection.Assembly.GetEntryAssembly().GetCustomAttributes(GetType(System.Runtime.InteropServices.GuidAttribute), True)

 	Dim guid As Byte() = Encoding.UTF8.GetBytes(New Guid(DirectCast(assemblyObjects(0), System.Runtime.InteropServices.GuidAttribute).Value).ToString("N"))


 	' Durchsuche Guid nach akzeptablen Fields
 	For Each b As Byte In guid
 	If b <= 96 Then
 	If counter < length Then
 	' Field gefunden, füge der Liste hinzu
 	resultArray(counter) = b
 	counter += 1
 	End If
 	End If
 	Next

 	' Sollten die Zeichen aus der Guid nicht reichen, erzeugen wir weitere
 	If counter <> length Then
 	Dim i As Integer = counter
 	While i <> length
 	' Wir generieren neue dazu
 	If resultArray(i - 1) + 1 <= 96 Then
 	resultArray(i) = resultArray(i - 1) + 1
 	Else
 	resultArray(i) = resultArray(i - 5) - 10
 	End If
 	i += 1
 	End While
 	End If

 	' Gebe die generierten Fields zurück
 	Return resultArray
	End Function

	Public Shared Function SerialNummerGenerieren(ByVal userName As String) As String
 	Dim mySalt As Byte() = {104, 255, 12, 132, 91, 254, 29}
 	Dim myFields As Integer() = {10, 29, 41, 58, 80, 45, 31, 23, 74, 42}
 	Dim SerialNumber1 As String = generateSerialNumber(userName, mySalt, myFields)
 	Dim mySalt2 As Byte() = {50, 210, 10, 255, 65, 255, 155}
 	Dim myFields2 As Integer() = {10, 29, 41, 58, 80, 45, 31, 23, 74, 42}
 	Dim SerialNumber2 As String = generateSerialNumber(userName & "XX0897XX", mySalt2, myFields2)
 	Dim mySalt3 As Byte() = {80, 255, 1, 255, 187, 211, 138}
 	Dim myFields3 As Integer() = {10, 29, 41, 58, 80, 45, 31, 23, 74, 42}
 	Dim SerialNumber3 As String = generateSerialNumber(userName & "<<+-+-///*****&&&%%159,$§!!!?=ß)()()(/&%/§$!§$%&/(90ß`ß" & """" & "?=)(/%&/&%%NHNHBHBHGVGVFGVJUBVZVFC", mySalt3, myFields3)
 	Dim Serial As String = SerialNumber1 & "-" & SerialNumber2 & "-" & SerialNumber3
 	Return Serial


	End Function

	Public Shared Function SerialNummerÜberprüfen(ByVal username As String, ByVal key As String) As Boolean
 	Dim SplitString() As String = key.Split("-")
 	Dim mySalt As Byte() = {104, 255, 12, 132, 91, 254, 29}
 	Dim myFields As Integer() = {10, 29, 41, 58, 80, 45, 31, 23, 74, 42}
 	Dim validate1 As Boolean = validateSerialNumber(username, SplitString(0), mySalt, myFields)

 	If validate1 = False Then

 	Return False
 	Exit Function
 	Else

 	End If


	End Function
	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

	End Sub


	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 	TextBox2.Text = SerialNummerGenerieren(TextBox1.Text)
	End Sub

	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 	If SerialNummerÜberprüfen(TextBox1.Text, TextBox2.Text) = True Then
 	MsgBox("Richtige Serial")
 	Else
 	MsgBox("Falsche Serial")
 	End If

	End Sub
End Class


Form1.Designer.vb:

Visual Basic.NET
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
	Inherits System.Windows.Forms.Form

	'Form overrides dispose to clean up the component list.
	<System.Diagnostics.DebuggerNonUserCode()> _
	Protected Overrides Sub Dispose(ByVal disposing As Boolean)
 	Try
 	If disposing AndAlso components IsNot Nothing Then
 	components.Dispose()
 	End If
 	Finally
 	MyBase.Dispose(disposing)
 	End Try
	End Sub

	'Required by the Windows Form Designer
	Private components As System.ComponentModel.IContainer

	'NOTE: The following procedure is required by the Windows Form Designer
	'It can be modified using the Windows Form Designer. 
	'Do not modify it using the code editor.
	<System.Diagnostics.DebuggerStepThrough()> _
	Private Sub InitializeComponent()
 	Me.Label1 = New System.Windows.Forms.Label
 	Me.TextBox1 = New System.Windows.Forms.TextBox
 	Me.Label2 = New System.Windows.Forms.Label
 	Me.TextBox2 = New System.Windows.Forms.TextBox
 	Me.Button1 = New System.Windows.Forms.Button
 	Me.Button2 = New System.Windows.Forms.Button
 	Me.SuspendLayout()
 	'
 	'Label1
 	'
 	Me.Label1.AutoSize = True
 	Me.Label1.Location = New System.Drawing.Point(25, 13)
 	Me.Label1.Name = "Label1"
 	Me.Label1.Size = New System.Drawing.Size(53, 13)
 	Me.Label1.TabIndex = 0
 	Me.Label1.Text = "Ihr Name:"
 	'
 	'TextBox1
 	'
 	Me.TextBox1.Location = New System.Drawing.Point(85, 5)
 	Me.TextBox1.Name = "TextBox1"
 	Me.TextBox1.Size = New System.Drawing.Size(259, 20)
 	Me.TextBox1.TabIndex = 1
 	'
 	'Label2
 	'
 	Me.Label2.AutoSize = True
 	Me.Label2.Location = New System.Drawing.Point(28, 42)
 	Me.Label2.Name = "Label2"
 	Me.Label2.Size = New System.Drawing.Size(98, 13)
 	Me.Label2.TabIndex = 2
 	Me.Label2.Text = "Ihre Seriennummer:"
 	'
 	'TextBox2
 	'
 	Me.TextBox2.Location = New System.Drawing.Point(132, 42)
 	Me.TextBox2.Name = "TextBox2"
 	Me.TextBox2.Size = New System.Drawing.Size(259, 20)
 	Me.TextBox2.TabIndex = 3
 	'
 	'Button1
 	'
 	Me.Button1.Location = New System.Drawing.Point(28, 77)
 	Me.Button1.Name = "Button1"
 	Me.Button1.Size = New System.Drawing.Size(75, 23)
 	Me.Button1.TabIndex = 4
 	Me.Button1.Text = "Generieren"
 	Me.Button1.UseVisualStyleBackColor = True
 	'
 	'Button2
 	'
 	Me.Button2.Location = New System.Drawing.Point(411, 77)
 	Me.Button2.Name = "Button2"
 	Me.Button2.Size = New System.Drawing.Size(75, 23)
 	Me.Button2.TabIndex = 5
 	Me.Button2.Text = "Überprüfen"
 	Me.Button2.UseVisualStyleBackColor = True
 	'
 	'Form1
 	'
 	Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
 	Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
 	Me.ClientSize = New System.Drawing.Size(557, 111)
 	Me.Controls.Add(Me.Button2)
 	Me.Controls.Add(Me.Button1)
 	Me.Controls.Add(Me.TextBox2)
 	Me.Controls.Add(Me.Label2)
 	Me.Controls.Add(Me.TextBox1)
 	Me.Controls.Add(Me.Label1)
 	Me.Name = "Form1"
 	Me.Text = "raupKeySystem"
 	Me.ResumeLayout(False)
 	Me.PerformLayout()

	End Sub
	Friend WithEvents Label1 As System.Windows.Forms.Label
	Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
	Friend WithEvents Label2 As System.Windows.Forms.Label
	Friend WithEvents TextBox2 As System.Windows.Forms.TextBox
	Friend WithEvents Button1 As System.Windows.Forms.Button
	Friend WithEvents Button2 As System.Windows.Forms.Button

End Class


Woran liegst?

MfG
raupy
Eingefügtes Bild
0

Geschrieben 23. Feb 2010 - 18:14 (#5) Mitglied ist offline   Dennis Alexander 

  • Administrator
  • Blog anzeigen
  • Gruppe: Administratoren
  • Beiträge: 533
  • Registriert: 09. Sep. 09
  • Wohnort: Bad Essen
  • OS: Windows 7 Prof.
  • IDE: Visual Studio 2010 Ultimate

Ich habe derzeit keine Möglichkeit dir zu helfen. Ich hoffe das ich am Wochenende drüberschauen kann.

Tipps zur Selbsthilfe:

  • Onlinekonverter benutzen und die restlichen Fehler versuchen nachzubessern
  • Methoden einzelnd debuggen (mit Haltepunkten) um evtl. Fehlbearbeitungen zu sehen



Eingefügtes Bild
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.” – Rich Cook
0

Geschrieben 24. Feb 2010 - 22:18 (#6) Mitglied ist offline   VB-Programer 

  • Semi-Profi
  • PIPPIPPIPPIPPIP
  • Gruppe: Senior Mitglieder
  • Beiträge: 345
  • Registriert: 11. Sep. 09
  • OS: Windows 7 Ultimate
  • IDE: Visual Studio 2008 Pro

Ich habe den C# Code in VB.NET Code umgewandelt und funktioniert auch. nur was mich wundert, das er eine viel kürzere Seriennummer anzeigt, als mit deinem Testprogramm
0

Geschrieben 28. Feb 2010 - 20:12 (#7) Mitglied ist offline   xSMiNTx 

  • Anfänger
  • PIP
  • Gruppe: Mitglieder
  • Beiträge: 2
  • Registriert: 19. Feb. 10
  • Wohnort: St. Gallen, Schweiz
  • OS: Windows 7 Home Premium (x64)
  • IDE: Microsoft Visual Studio 2010 Ultimate

nur ne designfage
mir gefällt die schriftart sehr und wollte darum fragen ob du mir sie verraten könntest :D

mfg xSMiNTx
0

Geschrieben 28. Feb 2010 - 20:16 (#8) Mitglied ist offline   Maximilian 

  • capo dei capi
  • Blog anzeigen
  • Gruppe: Administratoren
  • Beiträge: 816
  • Registriert: 10. Sep. 09
  • Wohnort: Im dicken B oben an der Spree
  • OS: Windows 7 Ultimate (x64)
  • IDE: VS 2010 Premium

Schaut für mich nach Segoe UI oder Calibri aus.

Cheerio
Mit freundlichen Grüßen
Eingefügtes Bild
MaximilianKrauss.Net | updateSystem.NET

"Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."


Unterstütze qualitative Beiträge durch ein Klick auf Eingefügtes Bild.
0

Geschrieben 28. Feb 2010 - 20:17 (#9) Mitglied ist offline   xSMiNTx 

  • Anfänger
  • PIP
  • Gruppe: Mitglieder
  • Beiträge: 2
  • Registriert: 19. Feb. 10
  • Wohnort: St. Gallen, Schweiz
  • OS: Windows 7 Home Premium (x64)
  • IDE: Microsoft Visual Studio 2010 Ultimate

danke für die schnelle antwort :D
da werd ich ma kucken

[EDIT] Jo das war Calibri, 8pt

mfg xSMiNTx

Dieser Beitrag wurde von xSMiNTx bearbeitet: 28. Feb 2010 - 21:31

0

Thema verteilen:


Seite 1 von 1
  • Du kannst kein neues Thema erstellen
  • Antworten nicht möglich


  • (27 Seiten)
  • +
  • 1
  • 2
  • 3
  • Letzte »
Trackbacks
Trackback URL Trackback Date Total Hits
Not Available Gestern, 18:29 1
.net generiere guid - Google-Suche Gestern, 15:10 1
aktivierungscode erzeugen - Google-Suche 27. Jul. 2010 13:01 1
vb.net assembly guid auslesen - Google-Suche 26. Jul. 2010 05:04 1
Not Available 24. Jul. 2010 17:12 1
serial generieren - Google-Suche 22. Jul. 2010 15:16 2
generate and validate serial vb.net - Google-Suche 22. Jul. 2010 02:59 1
  • (27 Seiten)
  • +
  • 1
  • 2
  • 3
  • Letzte »

Similar Topics
  Thema Themenstarter Statistik Letzter Beitrag
Neue Antworten Symbol WSDL generieren per C# HyperteX 
  • 0 Antworten
  • 566 Aufrufe
Neue Antworten Symbol [C#] Seriennummern generieren
mit flexibler Länge + Blocksize oder Maske
Dennis Alexander 
  • 1 Antworten
  • 1.198 Aufrufe

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0


Enter your sign in name and password


Sign in options
Mit OpenID anmelden   Or sign in with these services