Forum: PC-Programmierung 128 Byte in eine variable speichern


von Johannes (Gast)


Lesenswert?

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
typedef union{
2
  long long upperPart;
3
  long long lowerPart;
4
}SUPER_LONG;
5
6
SUPER_LONG super_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

von Dr. Sommer (Gast)


Lesenswert?

Was genau soll das bringen? Warum kannst du das Array nicht so nutzen 
wie es ist?
long long wird wohl kaum 64byte aufnehmen können. Eher 64bit.

von Sebi (Gast)


Lesenswert?

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.

von hoppala (Gast)


Lesenswert?

Du hast die Bedeutuzng von Union noch nicht verstanden.

Versuchs mal mit struct.

von Freiberufler (Gast)


Lesenswert?

"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.

von DPA (Gast)


Lesenswert?

Angenommen du hast 128 bytes und willst diese in ein Array packen, dann 
nimm auch ein Array:
1
uint8_t data[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).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Johannes (Gast)


Lesenswert?

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.

Beitrag #5805049 wurde vom Autor gelöscht.
von Vlad T. (vlad_tepesch)


Lesenswert?

Johannes schrieb:
> es geht um eine RSA berechnung. dazu habe ich schon eine Implementierung
> gefunden
> https://github.com/andrewkiluk/RSA-Library

Ich würde von der Verwendung dieser Implementierung absehen.

Wer sowas schreibt:
1
// 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.

: Bearbeitet durch User
von Johannes (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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:
1
typedef struct {
2
  uint8_t data [128];
3
} BigNum;
4
5
void Multiply (const BigNum* a, const BigNum* b, BigNum* res) {
6
  res->data[0] = ...;
7
  res->data[1] = ...;
8
  ...
9
}
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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 :)

: Bearbeitet durch Moderator
von Udo S. (urschmitt)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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

Allgmein ist die Primliste relativ kurz

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.