8
votes

AES, Serpent ou Twofish dans l'exemple C?

J'ai trouvé beaucoup d'implémentations d'AES, Twofish et Serpent dans C. Mais je ne comprends pas vraiment les exemples. Je comprends seulement que certains sont fournis avec des exemples pour inverser une matrice.

Quelqu'un peut-il me signaler à un exemple ou à un fichier .C pour chiffrer / déchiffrer les données représentées par un char * et un mot de passe?


23 commentaires

Polarssl.org/trac/Browser/trunk/Library/aes.cle4/a > Polarssl.org/trac/browser/trunk/include/polarssl/aes .h Le 981 INT AES_ELSE_TEST (INT VERBOSE) La fonction contient le code d'exemple nécessaire pour travailler avec.


J'ai déjà vu cela auparavant, mais cela ne crypte que de la longueur de la longueur 16, et je ne suis pas si bon pour mod des fonctions principales, merci


Aussi celui-ci ici est bon aussi bien hoozi.com/articles/aesencryption.htm Essayez Googling pour les deux autres, il y en a beaucoup autour et leurs fonctions contiennent généralement de bons exemples. J'espère que j'ai compris et vous aidé avec votre question, sinon, s'il vous plaît élaborer plus.


@killerercode alors quel est votre objectif principal? Que vous ne pouvez pas trouver une implémentation adaptée à vos besoins? Quelles sont ces exigences, veuillez les définir dans la question.


Et au fait, n'oubliez pas que AES est un chiffre à blocs.


Tout ce dont j'ai besoin, c'est juste (char *) cryptage, je veux juste sécuriser certaines données dans mes fichiers d'application à l'aide de ces cryptes. quelque chose comme Aesencrypt (Char * Data, int Len, Char * Mot de passe, int Keysize); si possible c'est tout


Vous voudrez peut-être essayer Rijndael au lieu d'AES, l'ancien cryptage de la taille des blocs dans un multiple de 32 bits, tandis que l'AES est limitée à 128 bits (16 caractères) par bloc.


Ok, tout va faire, je ne peux tout simplement pas sembler trouver un bon exemple, et je ne suis pas vraiment un gourou, je veux juste que cette chose soit faite, merci.


Twofish est également un max 128 bits. Taille du bloc Cipher, et c'est ainsi que le serpent. Vous devrez crypter votre bloc de données par bloc et le déchiffrer le bloc par bloc.


Vous ne connaissez pas d'exemples que je peux utiliser?


@killerercode Si vous n'êtes pas limité à C, je suggère de regarder dans la bibliothèque Cryptopp C ++. Vous devrez télécharger, compiler et relier la bibliothèque à votre application.


16 octets est la longueur du bloc natif pour AES, Twofish et Serpent. Si vous avez trouvé une API qui vous donne cela, vous devez implémenter un mode chiffre autour de lui. Le mode recommandé pour ces chiffres de blocs est CBC dans la plupart des cas. en.wikipedia.org/wiki/block_cipher_modes_of_opération


La mise en œuvre de Hoozi d'AES est bonne. hoozi.com/post/829n1/... a tout ce que vous recherchez dans la fonction principale () , essayez-le, cela fonctionne.


Je suis, je dois le faire en C, car la majeure partie de mon application est en C, je ne peux pas porter tout ça, et je suis mieux en C


Si la majeure partie de votre application est en C, alors je suppose que vous savez que vous savez suffisamment de C pour interfacer l'implémentation de Hooze, son principal () contient la procédure correcte, les boucles nécessaires et tout.


Oui, mais encore une fois, il ne prend en charge que des données de caractères [16] à chiffrer, et mes données pourraient être grandes, ne peuvent pas boucler tous les 16 caractères, qui prendront du temps, et vérifiez si pas les données alignées également: /


"Il est conseillé de ne pas utiliser cette implémentation directement dans un produit ou une application de sécurité. Veuillez utiliser ce code source AES uniquement une base pour démarrer votre travail. Vous pouvez ajouter des mécanismes de retour (également appelés modes de chaînage de bloc de chiffrement) pour augmenter la sécurité de la sécurité de Cette mise en œuvre de AES et également pour réduire les risques de sécurité tels que la relecture de bloc. Si vous n'utilisez aucun mode de chaîne de bloc de chiffrement, un adversaire peut être capable de détecter et d'exploiter des motifs dans votre message. " ~ Hoozi. Lisez ce que @Lunatic ExperimimistatList a écrit.


@killerercode, le chiffre est un chiffre à blocs, vous devrez faire boucle, il n'y a pas d'autre moyen. Vérifiez les chiffres de flux si vous n'êtes pas à la hauteur de la CBC. EN.Wikipedia.org/wiki/stream_cipher#Unsage


mec, je veux juste crypter mes cordes, ce n'est pas si essentiel pour étudier, bloquer le chiffrement ou le flux de chiffrement, je veux juste crypter mes cordes en C, Rijndael, Eses, Twofish, CBC, EBC, peu importe ce que cela le fera


@KillerCode GO avec RC4 EN.Wikipedia.org/wiki/RC4#Implementation Cipher alors. Si vous voulez quelque chose de plus simple, sans la nécessité d'étudier, utilisez un chiffre de ceeasar.


Je viens de demander à AES ou à Twofish ou à Rijndael ou à Serpent, c'est tout je demande


Si vous décidez de lire au moins et de comprendre le code source de la mise en œuvre de AES, PolarsSL. org / trac / navigateur / trunk / bibliothèque / aes.c Le fichier PolarsSL a des tests (et le code de) trois modes ciphers d'AES (lignes 981 jusqu'à la fin).


@killerercode, si vous voulez vraiment des chiffres de blocs, vous devrez faire une certaine lecture (wiki + code source), je ne vois pas d'autre moyen de sortir. Cela vous prendra moins d'une journée pour tout comprendre et la mettre en œuvre.


3 Réponses :


0
votes

Télécharger les sources OpenSSL / PUTTY / GNUPG. Tous contiennent une source d'algorithme de cryptage correspondant. En outre, chaque algorithme a une implémentation de référence en C, qui peut être facilement trouvé sur Internet.


0 commentaires

8
votes

L'article Wikipedia est en réalité relié à un excellent Tutoriel (par x-n20 ) écrit en C qui vous fait traverser les mathématiques et fournit des implémentations C sur Go, ce qui est assez utile pour la compréhension le processus. Je recommanderais également de lire sur arithmétique de champ fini .

serpent et Twofish , ayant manqué le titre AES, ne sont pas si bien documentés sur Internet. N'oubliez pas que chacun fournit des implémentations de référence.

en train de les mettre en œuvre vous-même nécessitera une étude de leurs papiers respectifs et probablement le code source de référence.

Notez que vos 20 milliards de commentaires concernent tous le fait que l'interface NIST spécifié pour AES était que chaque chiffre fournit un bloc d'entrée de 128 bits (16 bits) et l'un des 128 bits, 192 bits et 256 bits blocs de clé.

Afin de crypter de manière sécurisée de manière à résoudre correctement la cryptanalyse, vous avez besoin d'un travail minutieux. Par exemple, si votre dernier bloc manque quelques octets nécessaires? Comment rembourrez-vous de manière sécurisée? De même, en fonction de l'utilisation prévue, il existe d'autres schémas, en particulier pour les grandes données répétitives, conçues pour résister à la cryptanalyse où vous savez que les données cryptées contiennent probablement le contenu de C: \ windows . Ce que les commentateurs essaient d'obtenir sont que pour toute utilisation du monde réel, de rester en sécurité, ces choses ont besoin de considération.

EDIT Étant donné que une autre question a été recadrée sur ce sujet, voici quelques liens:

  • Code ASM / C Brian Gladman pour divers crypto-algorithmes y compris AES, SHA et SERPENT.
  • Code AES d'OpenSSL dans leur CVS. Voir aussi des . Ils ne mettent pas en œuvre Serpent. Vous voudrez peut-être aussi regarder le reste de leur code sous crypto .
  • Crypto ++ . Si vous pouvez utiliser C ++ et ne sont qu'un utilisateur final de Crypto, vous avez besoin de cette bibliothèque (TM). Il y a des algorithmes là-bas, je n'ai jamais entendu parler de. Leur svn coffre .
  • libgcrypt fournit toute une suite de fonctions cryptographiques pour GPG . Spécifiquement, si vous êtes après AES, vous ne le trouverez peut-être pas ici, mais vous trouverez Camellia et Serpent.

5 commentaires

Merci, mais toujours le problème persiste, je ne suis pas en cryptographie, j'avais juste besoin de cordes cryptées, mon champ est totalement différent, s'il y a un exemple prêt à l'emploi serait Kewl, merci.


Malheureusement, la cryptographie est difficile à mettre en œuvre de manière sécurisée et la plupart des utilisations font partie de produits plus importants. Il n'y a pas beaucoup de cas pour simplement crypter ce que vous appelleriez une chaîne - normalement, vous envisagez de crypter des octets de données. En fait, les chiffres sont conçus à cette fin. Mais Crypto ++ pourrait être bon pour vous, comme d'autres l'ont suggéré. Mes liens vous aideront à comprendre la mise en œuvre, mais si vous voulez simplement l'utiliser, Crypto ++ n'est pas un mauvais départ.


Je suis l'auteur de ce tutoriel d'AES. J'ai également fait un tutoriel Twofish, situé ici: rohitab.com/discuss/ Sujet / 36074-C-Twofish


@ X-n20 ah bonjour! C'est un bon tutoriel. J'ai reliées votre compte alors à côté de la mention de cela afin que ce soit plus clair.


Le lien de tutoriel est cassé :(



1
votes

Essayer de répondre à la mise à jour - Question de Killercode Code>, voici ma tentative de réalisation de la même chose:

  • Télécharger ce code Twofish (merci à Schneier et al.): https://www.schneier.com/code/twofish-reerence-c.zip p> li>

  • Utilisez ce code (à votre propre risque de cours): P>

    int mode = MODE_CBC;
    int keySize = 256;
    int result = 0;
    
    keyInstance    ki;          /* key information, including tables */
    cipherInstance ci;          /* keeps mode (ECB, CBC) and IV */
    BYTE  plainText[MAX_BLK_CNT*(BLOCK_SIZE / 8)]; // 64 in size!
    BYTE cipherText[MAX_BLK_CNT*(BLOCK_SIZE / 8)];
    BYTE decryptOut[MAX_BLK_CNT*(BLOCK_SIZE / 8)];
    BYTE iv[BLOCK_SIZE / 8];
    int  i;
    
    
    /* select number of bytes to encrypt (multiple of block) */
    /* e.g., byteCnt = 16, 32, 48, 64 */
    //byteCnt = (BLOCK_SIZE / 8) * (1 + (rand() % MAX_BLK_CNT));
    
    /* generate test data */;
    int plainTextLength = 65;
    for (i = 0; i < min(plainTextLength, MAX_BLK_CNT*(BLOCK_SIZE / 8)); i++)
        plainText[i] = (BYTE)rand();
    
    if (plainTextLength > MAX_BLK_CNT * BLOCK_SIZE / 8) {
        ::MessageBox(NULL, _T("You need to increase your MAX_BLK_CNT for the plain-text to fit in one call."), _T("Error"), MB_OK);
        return;
    }
    
    int byteCnt = ceil((double)plainTextLength / (BLOCK_SIZE / 8.0)) * (BLOCK_SIZE / 8);
    
    /* ----------------------- */
    
    /* 'dummy' setup for a 128-bit key */
    if (makeKey(&ki, DIR_ENCRYPT, keySize, NULL) != TRUE)
        result = 1;
    
    /* ----------------------- */
    
    /* 'dummy' setup for cipher */
    if (cipherInit(&ci, mode, NULL) != TRUE)
        result = 1;
    
    /* select key bits */
    for (i = 0; i < keySize / 32; i++)
        ki.key32[i] = 0x10003 * rand();
    
    /* run the key schedule */
    reKey(&ki);
    
    /* set up random iv (if needed)*/
    if (mode != MODE_ECB)
    {
        for (i = 0; i < sizeof(iv); i++)
            iv[i] = (BYTE)rand();
    
        /* copy the IV to ci */
        memcpy(ci.iv32, iv, sizeof(ci.iv32));
    }
    
    /* encrypt the bytes */
    if (blockEncrypt(&ci, &ki, plainText, byteCnt * 8, cipherText) != byteCnt * 8)
        result = 1;
    
    /* ----------------------- */
    
    /* decrypt the bytes */
    if (mode != MODE_ECB)       /* first re-init the IV (if needed) */
        memcpy(ci.iv32, iv, sizeof(ci.iv32));
    
    if (blockDecrypt(&ci, &ki, cipherText, byteCnt * 8, decryptOut) != byteCnt * 8)
        result = 1;
    
    /* make sure the decrypt output matches original plaintext */
    if (memcmp(plainText, decryptOut, byteCnt))
        result = 1;
    
    if (result == 0) ::MessageBox(NULL, _T("Success"), _T("SUCCESS"), MB_OK);
    


0 commentaires