encrypt, setkey, encrypt_r, setkey_r - Crypter des messages de 64 bits
Bibliothèque de chiffrement et de déchiffrement (
libcrypto,
-lcrypto)
#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);
Ces fonctions chiffrent et déchiffrent des messages de 64 bits. La
fonction
setkey() permet de fournir la clef à utiliser pour
encrypt(). L'argument
key est une table de 64 octets, chacun
ayant la valeur 0 ou 1. L'octet key[n] où n=8*i-1 est ignoré, ce
qui ramène la clef à 56 bits effectifs.
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.
Ces routines ne renvoient pas de valeur.
Définissez
errno à zéro avant d'appeler les
fonctions ci-dessus. Si elles réussissent,
errno n'est pas
modifiée.
- ENOSYS
- La fonction n'est pas disponible. (Par exemple à
cause des restrictions américaines sur l'exportation de routines
cryptographiques...)
Parce qu'elles emploient le chiffrement par bloc DES, qui n'est plus
considéré comme sûr, les routines
encrypt(),
encrypt_r(),
setkey() et
setkey_r() ont été
retirées dans la glibc 2.28. Les applications devraient passer
à une bibliothèque de chiffrement moderne telle que
libgcrypt.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
encrypt(), setkey() |
Sécurité des threads |
MT-Unsafe race:crypt |
encrypt_r(), setkey_r() |
Sécurité des threads |
MT-Safe |
encrypt(),
setkey(): POSIX.1-2001, POSIX.1-2008, SUS, SVr4.
Les fonctions
encrypt_r() et
setkey_r() sont des extensions GNU.
Consultez
crypt(3).
Dans la glibc 2.2, ces fonctions utilisent l'algorithme DES.
#define _XOPEN_SOURCE
#include <crypt.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
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);
}
cbc_crypt(3),
crypt(3),
ecb_crypt(3)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Pierre Giraud <
[email protected]>
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 à
[email protected]