Cryptage (simple) avec cle aleatoire et integre

Description

Programme de cryptage de fichier simple puisque je n'utilise que la combinaison d'un Xor et d'un Rot (cryptage de cesars).
L'avantage c'est que je crypt des blocs de 4 octets avec chaque fois une clé différente et j'inclu la clé dans le fichier.

PS : C'est pas pour çà que c'est pas securisé, loin de là !

Source / Exemple :


{
 ------------------------------------------------------

    Unité de démonstration pour Delphi.fr

    Unité de cryptage de fichier avec clé aléatoire
    Ecrit Par LEVEUGLE Damien (c) 2005

 ------------------------------------------------------
}

unit cryptage;

interface

uses SysUtils;

procedure Crypter  ( FichierSource: string; FichierDestination : String );
procedure Decrypter( FichierSource: string; FichierDestination : String );

implementation

{ Crypter un fichier }
procedure Crypter( FichierSource: string; FichierDestination : String );
var
    BufSource : Array[1..4] of Char;         // Notre morceau de fichier en mémoire
    BufCrypte : Array[0..4] of Char;         // Buffer crypter avec la clé ( BufCrypt[0] = clé )

    SourceF, DestF : File;

    CryptageKey : Byte; // Notre clé généré aleatoirement

    Lu    : Integer;    // Nombre d'octet de fichier lu
    Ecrit : Integer;    // Nombre d'octet de fichier ecrit (pour verif. uniquement)

    i : Integer;        // Pour notre boucle

begin

    Randomize;

    Assign (SourceF, FichierSource);          // On ouvre le fichier source
    Reset  (SourceF, 1);

    Assign (DestF, FichierDestination);       // On crée le fichier destination
    Rewrite(DestF, 1);

    repeat

        FillChar( BufSource, SizeOf(BufSource), #0 ); // Initialise les buffers
        FillChar( BufCrypte, SizeOf(BufCrypte), #0 );

        CryptageKey := Random(255);             // On crée notre clé

        BlockRead( SourceF, BufSource, SizeOf( BufSource ), Lu );     // On lit un bloc de 2Ko de notre fichier source

        BufCrypte[0] := Chr( CryptageKey );  // On insère la clé a l'index 0

        for i := 1 to Lu do        // on crypte ce bloc en insérant la clé devant le bloc
            BufCrypte[i] := Chr( ( Ord( BufSource[i] ) xor CryptageKey ) + CryptageKey );   // Le reste on crypt simplement ( XOR + ROT )

        if Lu > 0 then BlockWrite( DestF, BufCrypte, Lu + 1, Ecrit );        // On ecrit notre Bloc crypté

    until ( ( Lu = 0 ) or ( ( Lu + 1 )<> Ecrit ) );        // On reprend un bloc de 2Ko

    Close( SourceF );     // On ferme
    Close( DestF   );     // les fichiers ouverts

end;

{ Decrypter un fichier }
procedure Decrypter( FichierSource: string; FichierDestination : String );
var
    BufCrypter : Array[0..4] of Char;    // Notre bloc crypter
    BufDecrypt : Array[1..4] of Char;    // Bloc decrypter

    SourceF, DestF : File;

    CryptageKey : Byte;                     // La clé

    Lu    : Integer;
    Ecrit : Integer;

    i : Integer;

begin

    Assign (SourceF, FichierSource);        // On ouvre nos fichiers
    Reset  (SourceF, 1);

    Assign (DestF, FichierDestination);     // Bla Bla ...
    Rewrite(DestF, 1);

    repeat

        FillChar( BufCrypter, SizeOf(BufCrypter), #0 );     // Initialise les buffers
        FillChar( BufDecrypt, SizeOf(BufDecrypt), #0 );

        BlockRead( SourceF, BufCrypter, SizeOf( BufCrypter ), Lu );   // On lit le fichier crypté

        CryptageKey := Ord( BufCrypter[0] );    // On recupère le premier caractère du bloc (c'est notre clé)

        for i := 1 to (Lu - 1) do
            BufDecrypt[i] := Chr( ( Ord( BufCrypter[i] ) - CryptageKey ) xor CryptageKey );    // Le reste on le decrypte grâce à la clé recupérée

        if Lu > 0 then BlockWrite( DestF, BufDecrypt, (Lu - 1), Ecrit );     // Et comme pour le cryptage ba on ecrit notre bloc dans le fichier destination
                                                            // ( "Lu - 1" car notre bufferDecrypt commence à 1 alors que notre BufCrypter commence à 0 )
    until ( ( Lu <= 0 ) or ( (Lu - 1) <> Ecrit ) );

    Close( SourceF );       // On ferme tout .. bla bla
    Close( DestF   );

end;

end.

Conclusion :


1) Vous pouvez changer la taille du bloc d'octet à codifier simplement (suffit de changer la valeur max dans les "Arrays" sans touché au code).

2) Vous pouvez modifier la methode de cryptage en combinant des Xor et des Rot comme il vous convient, et vous pouvez meme faire une opération de cryptage sur la clé si çà vous chante :-)

3) Marche parfaitement avec tout type de fichier ( j'ai même testé avec des Zip et des EXE).

Bon Code

Damien.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.