Guten morgen,
ich bekomme einen Array mit einer länge von 128 Bytes. Diese muss ich
zusammensetzen um damit zu arbeiten.
Der typ long long hat ja jetzt nur 64 Byte
Ist es möglich so etwas wie
1
typedefunion{
2
longlongupperPart;
3
longlonglowerPart;
4
}SUPER_LONG;
5
6
SUPER_LONGsuper_long;
wenn ich jetzt upperPart mit den ersten 64 Bytes beschreibe und den
lowerPart auch noch mal 64 Byte schreibe, ist dann der wert super_long
die 128 Bytes?
Johannes
Wenn dann als struct und nicht als union. Außerdem hat long long eher 64
Bit, statt 64 Byte. Was versprichst du dir davon? Rechnen kannst du mit
dem Wert dann immer noch nicht und dann könntest du auch ein
uint8_t[128] Array in dem struct speichern.
"long long"
Da denke ich immer an den Klavier spieler
https://de.wikipedia.org/wiki/Lang_Lang
Warum kann man nicht "int64_t" schreiben?
In <stdint.h> ist das definiert.
Angenommen du hast 128 bytes und willst diese in ein Array packen, dann
nimm auch ein Array:
1
uint8_tdata[128];
Das kann man auch als Struct member nehmen, für einfacheres Kopieren
usw.
Falls du die Daten interpretieren/parsen und die interpretierten Daten
dann in einer Struktur speichern willst, dann tu das einfach. Sehe dir
in dem Fall eventuell noch state machines und binäroperationen an.
Falls du eine 1024bit Zahl hast, und damit rechnen muss, nimm ne Library
dafür. z.B. GMP https://gmplib.org/
Für sowas wäre aber python einfacher als c (einfach bei Divisionen / und
// nicht verwechseln).
Johannes schrieb:> Der typ long long hat ja jetzt nur 64 Byte
Hat er nicht, der hat nur ein Achtel davon.
Wie wäre es, wenn Du Dich etwas eingehender mit den Datentypen der
Programmiersprache auseinandersetzt?
Wenn Du wirklich 128 Bytes speichern willst, kannst Du das mit einem
Array machen. Das ist keine Raketenwissenschaft.
Ja, ich habe ich mich vertan. long long (oder uint64_t) sind nur 64 bit.
also 8 Bytes.
ich hätte eigentlich sofort mein Problem schildern sollen.
es geht um eine RSA berechnung. dazu habe ich schon eine Implementierung
gefunden
https://github.com/andrewkiluk/RSA-Library
dort werden die keys, in einem Struct gespeichert (also der modulus und
der exponent). Den Modulus den ich aber bekomme, ist ein Array mit einer
länge von 128 Bytes.
Diese weiß ich nicht wie ich die speicher soll. Ich muss die ja
irgendwie zu einem Großen wert zusammenpacken, damit der key berechnet
werden kann.
// Change this line to the file you'd like to use as a source of primes.
2
// The format of the file should be one prime per line.
3
char*PRIME_SOURCE_FILE="primes.txt";
und dann noch in einen Header, dem würde ich bei der Implementierung der
Crypto-Algos nicht weiter trauen, als ich ihn werfen könnte.
Edit:
Bei genauerem Hinsehen ist es eher so eine Art Mini-RSA.
wobei der author auch schreibt, man solle die besser nicht für was
wichtiges einsetzen.
Allerdings verstehe ich dein Problem auch nicht. Wo steht denn was von
128 Bytes?
die Strukturen für die Keys sind vorgegeben. und die Payload ist ein
Bytezeiger mit Datenlänge.
Vlad T. schrieb:> Allerdings verstehe ich dein Problem auch nicht. Wo steht denn was von> 128 Bytes?
Das steht da nicht drinn, aber laut Anforderung bekomme ich einen
modulus über 128 Bytes
Vlad T. schrieb:> Die Strukturen für die Keys sind vorgegeben
Das ist richtig. Das müsste ich ja auch anpassen.
Im ganzen bräuchte ich eh nur die Funktion zum encrypt und decrypt,
welche die Funktion modExp aufruft. Alles andere käme eh weg.
Johannes schrieb:> Diese weiß ich nicht wie ich die speicher soll. Ich muss die ja> irgendwie zu einem Großen wert zusammenpacken, damit der key berechnet> werden kann.
Das geht in C und C++ erstmal so nicht. Es gibt keine Multiplikation auf
1024Bit-Typen. Selbst wenn du sie irgendwie zusammenpacken könntest,
könntest du doch nicht damit rechnen. Du musst dir eigene Funktionen
dafür schreiben, und dann kannst du die auch "ungepackt" lassen, ala:
Es gibt dafür aber natürlich schon Bibliotheken die das machen wie eben
GMP. In C++ kann man auch die Operatoren überladen sodass man die Zahlen
"normal" mit * multiplizieren kann.
Sinnvoll ist das alles nicht besonders. Wenn du Kryptographie auf
Mikrocontrollern machen möchtest, dann vielleicht lieber mit einer
etablierten Bibliothek wie "mbed TLS" (ehem. PolarSSL). Auf dem PC so
etwas wie OpenSSL.
Bei genauerem Blick in die Implementierung kommen mir arge Zweifel.
Ich bin weder Experte in Crypto, noch kenn ich RSA wirklich gut, aber
mindestens folgendes kommt mir mehr als spanisch vor:
im rsa_ncrypt wird jedes Input Byte einzeln auf einen long long
aufgeblasen und in einen long long "verschlüsselt".
das heißt, man hat einen 8-fach größeren Ausgabestrom mit einer 1:1
representation von 1 InputByte zu 8 Outputbyte Effektiv hat die Chiffre
also eine Blocklänge von 1.
Die Verschlüsselung ist also effektiv nur eine 256-Eintrag
lookup-tabelle und sehr leicht durch statistische Verfahren zu brechen.
Mit RSA hat das also nahezu nix zu tun und ist im Endeffekt nur eine
Monoalphabetische Substitution.
Wenn ich dich richtig verstehe, brauchst du einen Datentyp für
128-Bit-Integer und die Arithmetik dazu. Auf einem 64-Bit-PC ist dieser
Typ [unsigned] long long int (wie in der Originalsoftware), auf anderen
Plattformen gibt es diesen Typ evtl. nicht. Du kannst zwar einen Typ mit
128 Bit Speicherkapazität als Struct oder Array definieren, dann fehlen
aber immer noch die Arithmetikroutinen, die du in diesem Fall selber
schreiben müsstest. Zudem müsstest du den bestehenden Code nach
128-Bit-Rechenoperationen durchsuchen und diese durch deine selbst
geschriebenen ersetzen. In C++ geht dieser letzte Schritt Dank
Operatorüberladung etwas leichter von der Hand, aber das Schreiben der
Routinen nimmt dir keiner ab.
Auf welcher Plattform soll der Code denn laufen?
Vlad T. schrieb:> Bei genauerem Blick in die Implementierung kommen mir arge Zweifel.> Ich bin weder Experte in Crypto, noch kenn ich RSA wirklich gut, aber> mindestens folgendes kommt mir mehr als spanisch vor:>> im rsa_ncrypt wird jedes Input Byte einzeln auf einen long long> aufgeblasen und in einen long long "verschlüsselt".
Ich bin auch kein Experte auf diesem Gebiet, aber ein Blick in den
Wikipedia-Artikel löst deine Zweifel auf:
https://de.wikipedia.org/wiki/RSA-Kryptosystem#Verschl%C3%BCsselung
Der Modulus im Beispielprogramm test.c ist 732240073, d.h. der
Wertebereich der Daten ist 0..732240072. Die unverschlüsselten Daten im
Testprogramm nutzen von diesem Wertebereich aber nur den Bereich von
0..255, was natürlich wenig Sinn macht und auch einen Hebel für Angriffe
darstellt.
Um die Wertebereiche anzugleichen, müssen die unverschlüsselten Daten
geeignet vorverarbeitet werden, bspw. durch Darstellung der Daten in
einem N-adischen Stellenwertsystem (N ist der Modulus).
Umgekehrt muss man die verschlüsselten Daten nachbearbeiten, um daraus
einen nichtredundanten Bytestrom (Wertebereich 0..255) zu erhalten.
Vielleicht habe ich das alles aber auch falsch verstanden, dann möge
mich ein Kryptoexperte bitte berichtigen :)
Ich bin auch kein Kryptoexperte, aber wenn der TO mehr wie nur spielen
will, dann sollte er diesen Rat berücksichtigen:
Dr. Sommer schrieb:> Auf dem PC so etwas wie OpenSSL.
und nicht selbst rumbasteln.
Yalu X. schrieb:> Wenn ich dich richtig verstehe, brauchst du einen Datentyp für> 128-Bit-Integer und die Arithmetik dazu
Nein, für 1024-Bit (128 Byte). 128-Bit-RSA ist witzlos.
Yalu X. schrieb:> https://de.wikipedia.org/wiki/RSA-Kryptosystem#Verschl%C3%BCsselung>> Der Modulus im Beispielprogramm test.c ist 732240073, d.h. der> Wertebereich der Daten ist 0..732240072. Die unverschlüsselten Daten im> Testprogramm nutzen von diesem Wertebereich aber nur den Bereich von> 0..255, was natürlich wenig Sinn macht und auch einen Hebel für Angriffe> darstellt.
ja, das problem ist ja aber genau das, dass jeder Buchstabe einzeln
kodiert wird. Im wikipedia Beispiel werden immer mehrere Buchstaben
zusammengefasst.
Ich denke der Modul sollte eine garantierte Mindestlänge haben, so dass
man n Bytes zusammenfasst und gleichzeitg verschlüsselt.
Die schlüssel-Generieerung testet zum Beispiel auch nicht auf
Dr. Sommer schrieb:> Yalu X. schrieb:>> Wenn ich dich richtig verstehe, brauchst du einen Datentyp für>> 128-Bit-Integer und die Arithmetik dazu>> Nein, für 1024-Bit (128 Byte). 128-Bit-RSA ist witzlos.
In dem vom TE verlinkten Code sind es tatsächlich nur 128 Bit (long
long). Da steht aber auch
1
I make no claim that any good encyrption practices are used here.
2
Probably don't use this for any production purposes.
Das Ganze dient wohl eher der Demonstration des Funktionsprinzips von
RSA.
Yalu X. schrieb:> In dem vom TE verlinkten Code sind es tatsächlich nur 128 Bit (long> long). Da steht aber auch
es sind 64 und eigentlich nicht mal das.
die vom autor ausgesuchten primzahlen, aus denen zufällig ausgewählt
wird ergeben nur relativ kleine Anzahl an kombinationen:
76930441 (ohne ungültige paare auszuschließen), also 26bit