Forum: PC-Programmierung libtomcrypt rsa_key


von Felix (Gast)


Lesenswert?

Hallo,

ich versuche die libtomcrypt zu verstehen und möchte später einfach nur 
etwas verschlüsseln und entschlüsseln.
Die Schlüssel (Modulus und Exponent) habe ich als uint8 Array vorliegen.
Aber wie bringe ich diese in den datenTyp rsa_key?
1
typedef struct Rsa_key {
2
    /** Type of key, PK_PRIVATE or PK_PUBLIC */
3
    int type;
4
    /** The public exponent */
5
    void *e;
6
    /** The private exponent */
7
    void *d;
8
    /** The modulus */
9
    void *N;
10
    /** The p factor of N */
11
    void *p;
12
    /** The q factor of N */
13
    void *q;
14
    /** The 1/q mod p CRT param */
15
    void *qP;
16
    /** The d mod (p - 1) CRT param */
17
    void *dP;
18
    /** The d mod (q - 1) CRT param */
19
    void *dQ;
20
} rsa_key;

Die andere Elemente kann ich ja einfach auf NULL setzen. aber wie ist es 
zu verstehen, wenn ein Element void ist?

von fop (Gast)


Lesenswert?

Die sind Zeiger auf void. Was im Endeffekt Zeiger auf irgendwas 
bedeutet.
Kannst ja mal versuchen, den Zeiger auf das erste Element Deines Arrays 
zu setzen.
Da C für Schreibfaule ist, kann man die erste Adresse des Arrays 
angeben, indem man nur den Arraynamen ohne eckige Klammern schreibt.
Wenn Du eine Warnung bekommst, dass ein Zeiger auf uint8 was anderes ist 
als ein Zeiger auf wasauchimmer, kannst Du einen Typecast nutzen. 
(void*)arrayname

von Stephan (Gast)


Lesenswert?

Felix schrieb:
> ein Element void ist

Das "Element" in der o.g. Struktur ist ja selbst eben KEIN Element 
sondern ein Zeiger/Pointer auf eine Speicherstelle. Das macht das '*'.
Wenn nun ein Pointer "void" typisiert ist, ändert sich erstmal nicht 
viel ausser das die Pointerarithmetik von einer länge der DATEN auf die 
der Pointer zeigt von meist der Basis-INT-länge ausgeht. In einem 32-Bit 
System wäre sizeof(void *) also 4 (4*8).

Ein bisschen abtrahiert:

uint8_t i8* zeigt auf eine Speicherstelle
*i8++ zeigt auf die NÄCHSTE Speicherstelle (also +1 x uint8_t)

uint32_t i32* zeigt auf eine Speicherstelle
*i32++ zeigt auf die 4t NÄCHSTE Speicherstelle (also +1 x uint32_t)

void v* zeigt auf eine Speicherstelle
*v++ zeigt auf die <basistyp> NÄCHSTE Speicherstelle (also +1 x 
basistyp-länge)

vg, Stephan

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.