#define _XOPEN_SOURCE /* Consultez feature_test_macros(7) */ #include <unistd.h> [[obsolète]] void encrypt(char block[64], int edflag); #define _XOPEN_SOURCE /* Consultez feature_test_macros(7) */ #include <stdlib.h> [[obsolète]] void setkey(const char *key); #define _GNU_SOURCE /* Consultez feature_test_macros(7) */ #include <crypt.h> [[obsolète]] void setkey_r(const char *key, struct crypt_data *data); [[obsolète]] void encrypt_r(char *block, int edflag, struct crypt_data *data);
La fonction encrypt() modifie le tampon transmis, en l'encodant si l'argument edflag vaut 0, et en le décodant s'il vaut 1. L'argument block est, comme l'argument key, une représentation de la valeur à encoder sous forme de vecteur de bits. Le résultat est renvoyé dans le même vecteur.
Ces deux fonctions ne sont pas réentrantes, c'est-à-dire que la clef est stockée dans une zone de stockage statique. Les fonctions setkey_r() et encrypt_r() sont des versions réentrantes. Elles utilisent la structure suivante pour contenir la clef :
struct crypt_data {
char keysched[16 * 8];
char sb0[32768];
char sb1[32768];
char sb2[32768];
char sb3[32768];
char crypt_3_buf[14];
char current_salt[2];
long current_saltbits;
int direction;
int initialized;
};
Avant d'appeler setkey_r(), définissez data->initialized à zéro.
Interface | Attribut | Valeur |
encrypt(), setkey() | Sécurité des threads | MT-Unsafe race:crypt |
encrypt_r(), setkey_r() | Sécurité des threads | MT-Safe |
Les fonctions encrypt_r() et setkey_r() sont des extensions GNU.
int
main(void)
{
char key[64];
char orig[9] = "eggplant";
char buf[64];
char txt[9];
for (size_t i = 0; i < 64; i++) {
key[i] = rand() & 1;
}
for (size_t i = 0; i < 8; i++) {
for (size_t j = 0; j < 8; j++) {
buf[i * 8 + j] = orig[i] >> j & 1;
}
setkey(key);
}
printf("Avant chiffrement : %s\n", orig);
encrypt(buf, 0);
for (size_t i = 0; i < 8; i++) {
for (size_t j = 0, txt[i] = '\0'; j < 8; j++) {
txt[i] |= buf[i * 8 + j] << j;
}
txt[8] = '\0';
}
printf("Après chiffrement : %s\n", txt);
encrypt(buf, 1);
for (size_t i = 0; i < 8; i++) {
for (size_t j = 0, txt[i] = '\0'; j < 8; j++) {
txt[i] |= buf[i * 8 + j] << j;
}
txt[8] = '\0';
}
printf("Après déchiffrement : %s\n", txt);
exit(EXIT_SUCCESS);
}
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à