begin process at 2010 03 22 04:47:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Composants

 > COMPOSANT : TDBPVERNAM (CRYPTEUR DE TEXTE/FICHIER)

COMPOSANT : TDBPVERNAM (CRYPTEUR DE TEXTE/FICHIER)


 Information sur la source

Note :
9,13 / 10 - par 8 personnes
9,13 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Composants Classé sous :vernam, crypter, cryptage, coder, secret Niveau :Initié Date de création :10/12/2004 Vu / téléchargé :5 618 / 481

Auteur : JulioDelphi

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (26)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Hello,
4eme source parlant du Vernam (j'en connais un qui va etre content :D)
Ce composant reprends les fonctions de cryptage Vernam de Mauricio, autant pour les fichiers que pour le texte. Ses fonctions ont été une améliorations de la source de RM50Man.

Une demo est dispo dans le zip.
Voyez l'utilisation (simple) du composant grace a cette demo.
<pub> Dispo aussi sur http://diabloporc.free.fr :D </pub>

Source

  • {
  • ################################################################################
  • # DBPVERNAM #
  • ################################################################################
  • # #
  • # VERSION : 1.2 #
  • # FICHIERS : dbpVernam.pas,.dcu,.dcr,.bmp,ReadMe.htm #
  • # AUTEUR : Julio P. (Diabloporc) #
  • # CREATION : 09 dec 2004 #
  • # MODIFIEE : 10 dec 2004 #
  • # SITE WEB : http://diabloporc.free.fr #
  • # MAIL : diabloporc@laposte.net #
  • # LEGAL : Free sous Licence GNU/GPL #
  • # INFOS : Retrouvez moi sur www.delphifr.com : "JulioDelphi" #
  • # #
  • ################################################################################
  • }
  • unit dbpVernam;
  • interface
  • uses
  • Math, SysUtils, Classes;
  • type
  • TdbpVernam = class(TComponent)
  • private
  • fText, fTextEncode, fTextDecode, fTextCle, fAbout: string;
  • fFile, fFileEncoded, fFileDecoded, fFileKey: TFileName;
  • fUseTextCle, fUseFileKey: boolean;
  • procedure SetFile(const Value: TFileName);
  • procedure SetFileEncoded(const Value: TFileName);
  • procedure setFileDecoded(const Value: TFileName);
  • procedure SetFileKey(const Value: TFileName);
  • procedure SetAbout(const Value: string);
  • protected
  • { Protected declarations }
  • public
  • constructor Create(AOwner: TComponent); override;
  • published
  • property About: String read fAbout write SetAbout;
  • property Fichier: TFileName read fFile write SetFile;
  • property FichierEncode: TFileName read fFileEncoded write SetFileEncoded;
  • property FichierDecode: TFileName read fFileDecoded write SetFileDecoded;
  • property FichierCle: TFileName read fFileKey write SetFileKey;
  • property UtiliserFichierCle: boolean read fUseFileKey write fUseFileKey;
  • property Text: string read fText write fText;
  • property TextEncode: string read fTextEncode write fTextEncode;
  • property TextDecode: string read fTextDecode write fTextDecode;
  • property TextCle: string read fTextCle write fTextCle;
  • property UtiliserTextCle: boolean read fUseTextCle write fUseTextCle;
  • function EncodeFichier: boolean;
  • function DecodeFichier: boolean;
  • function EncodeText: boolean;
  • function DecodeText: boolean;
  • end;
  • procedure Register;
  • implementation
  • {$R dbpVernam.dcr}
  • procedure VERNAM_CRYPT_FILE(Src, Dest, Chave: TFileName);
  • var fs_Src, fs_Dest, fs_Chave: TFileStream;
  • fs_Src_Buffer, fs_Dest_Buffer, fs_Chave_Buffer: Array[0..1023] of byte; // Buffers de 1Ko ...
  • fs_Buffer_size: Int64;
  • i: Integer;
  • begin
  • Randomize;
  • fs_Src := TFileStream.Create(Src, fmOpenRead or fmShareDenyWrite);
  • fs_Dest := TFileStream.Create(Dest, fmCreate or fmShareExclusive);
  • fs_Chave := TFileStream.Create(Chave, fmCreate or fmShareExclusive);
  • Try
  • While fs_Src.Position < fs_Src.Size Do
  • begin
  • fs_Buffer_size := fs_Src.Size - fs_Src.Position;
  • If fs_Buffer_size > 1024
  • Then fs_Buffer_size := 1024;
  • fs_Src.Read(fs_Src_Buffer, fs_Buffer_size);
  • for i := 0 to fs_Buffer_size - 1 do
  • begin
  • fs_Chave_Buffer[i] := RandomRange(0, 247); // 1 byte = 8bits (1 octet en français) donc valeur max. est de 11111111 en binaire = 247 en décimal ...
  • fs_Dest_Buffer[i] := fs_Chave_Buffer[i] XOR fs_Src_Buffer[i];
  • end;
  • fs_Chave.Write(fs_Chave_Buffer, fs_Buffer_size);
  • fs_Dest.Write(fs_Dest_Buffer, fs_Buffer_size);
  • end;
  • Finally
  • fs_Src.Free;
  • fs_Dest.Free;
  • fs_Chave.Free;
  • End;
  • end;
  • procedure VERNAM_CRYPT_FILE_WITH_PREDEF_KEY(Src, Dest, Chave: TFileName);
  • var fs_Src, fs_Dest, fs_Chave: TFileStream;
  • fs_Src_Buffer, fs_Dest_Buffer, fs_Chave_Buffer, fs_Chave_Buffer2: Array[0..1023] of byte; // Buffers de 1Ko ...
  • fs_Src_Buffer_size, fs_Chave_Buffer_size, TransfBytes: Int64;
  • i: Integer;
  • begin
  • Randomize;
  • fs_Src := TFileStream.Create(Src, fmOpenRead or fmShareDenyWrite);
  • fs_Dest := TFileStream.Create(Dest, fmCreate or fmShareExclusive);
  • fs_Chave := TFileStream.Create(Chave, fmOpenRead or fmShareDenyWrite);
  • Try
  • While fs_Src.Position < fs_Src.Size Do
  • begin
  • fs_Src_Buffer_size := fs_Src.Size - fs_Src.Position;
  • If fs_Src_Buffer_size > 1024
  • Then fs_Src_Buffer_size := 1024;
  • fs_Src.Read(fs_Src_Buffer, fs_Src_Buffer_size);
  • // On doit contrôler la lecture du fichier clé parce que celui-ci peut être + petit que le fichier crypté !
  • fs_Chave_Buffer_size := 0;
  • While fs_Chave_Buffer_size < fs_Src_Buffer_size do // On doit avoir le meme nombre de bytes ...
  • begin
  • TransfBytes := fs_Chave.Size - fs_Chave.Position; // Bytes dispo à lire dans le fichier clé ...
  • If TransfBytes = 0 // On est à la fin du fichier clé ...
  • Then Begin
  • fs_Chave.Seek(0, soFromBeginning);
  • TransfBytes := fs_Chave.Size;
  • End;
  • If TransfBytes + fs_Chave_Buffer_size > fs_Src_Buffer_size
  • Then TransfBytes := fs_Src_Buffer_size - fs_Chave_Buffer_size;
  • fs_Chave.Read(fs_Chave_Buffer2, TransfBytes); // Mémoire temporaire pour transférer vers fs_Chave_Buffer ...
  • for i := 0 to TransfBytes - 1 do // Compléter le buffer de la clé ...
  • fs_Chave_Buffer[fs_Chave_Buffer_size + i] := fs_Chave_Buffer2[i];
  • fs_Chave_Buffer_size := fs_Chave_Buffer_size + TransfBytes;
  • end;
  • for i := 0 to fs_Src_Buffer_size - 1 do
  • fs_Dest_Buffer[i] := fs_Chave_Buffer[i] XOR fs_Src_Buffer[i];
  • fs_Dest.Write(fs_Dest_Buffer, fs_Src_Buffer_size);
  • end;
  • Finally
  • fs_Src.Free;
  • fs_Dest.Free;
  • fs_Chave.Free;
  • End;
  • end;
  • procedure VERNAM_DECRYPT_FILE(Src, Dest, Chave: TFileName);
  • var fs_Src, fs_Dest, fs_Chave: TFileStream;
  • fs_Src_Buffer, fs_Dest_Buffer, fs_Chave_Buffer, fs_Chave_Buffer2: Array[0..1023] of byte; // Buffers de 1Ko ...
  • fs_Src_Buffer_size, fs_Chave_Buffer_size, TransfBytes: Int64;
  • i: Integer;
  • begin
  • fs_Src := TFileStream.Create(Src, fmOpenRead or fmShareDenyWrite);
  • fs_Dest := TFileStream.Create(Dest, fmCreate or fmShareExclusive);
  • fs_Chave := TFileStream.Create(Chave, fmOpenRead or fmShareDenyWrite);
  • Try
  • While fs_Src.Position < fs_Src.Size Do
  • begin
  • fs_Src_Buffer_size := fs_Src.Size - fs_Src.Position;
  • If fs_Src_Buffer_size > 1024
  • Then fs_Src_Buffer_size := 1024;
  • fs_Src.Read(fs_Src_Buffer, fs_Src_Buffer_size);
  • // On doit contrôler la lecture du fichier clé parce que celui-ci peut être + petit que le fichier crypté !
  • fs_Chave_Buffer_size := 0;
  • While fs_Chave_Buffer_size < fs_Src_Buffer_size do
  • begin
  • TransfBytes := fs_Chave.Size - fs_Chave.Position; // Bytes dispo à lire dans le fichier clé ...
  • If TransfBytes = 0 // On est à la fin du fichier clé ...
  • Then Begin
  • fs_Chave.Seek(0, soFromBeginning);
  • TransfBytes := fs_Chave.Size;
  • End;
  • If TransfBytes + fs_Chave_Buffer_size > fs_Src_Buffer_size
  • Then TransfBytes := fs_Src_Buffer_size - fs_Chave_Buffer_size;
  • fs_Chave.Read(fs_Chave_Buffer2, TransfBytes); // Mémoire temporaire pour transférer vers fs_Chave_Buffer ...
  • for i := 0 to TransfBytes - 1 do // Compléter le buffer de la clé ...
  • fs_Chave_Buffer[fs_Chave_Buffer_size + i] := fs_Chave_Buffer2[i];
  • fs_Chave_Buffer_size := fs_Chave_Buffer_size + TransfBytes;
  • end;
  • for i := 0 to fs_Src_Buffer_size - 1 do
  • fs_Dest_Buffer[i] := fs_Chave_Buffer[i] XOR fs_Src_Buffer[i];
  • fs_Dest.Write(fs_Dest_Buffer, fs_Src_Buffer_size);
  • end;
  • Finally
  • fs_Src.Free;
  • fs_Dest.Free;
  • fs_Chave.Free;
  • End;
  • end;
  • function VERNAM_CRYPT(Texto: String; Var Chave: String): String;
  • var i, curOrd: Integer;
  • RandomVal : byte;
  • begin
  • RESULT := '';
  • Chave := '';
  • Randomize;
  • for i := 1 to length(Texto) do
  • begin
  • repeat
  • RandomVal := RandomRange(1, 127);
  • curOrd := Ord(Texto[i]) XOR RandomVal;
  • until curOrd <> 0; // Ça foire si curOrd = 0 (Quand Ord(Texto[i]) = RandomVal) parce que chr(0) n' existe pas !!!
  • RESULT := RESULT + Chr(curOrd);
  • Chave := Chave + chr(RandomVal);
  • end;
  • end;
  • function VERNAM_CRYPT_WITH_PREDEF_KEY(Texto: String; Chave: String): String;
  • var i, curOrd, lengthChave, lengthTexto, repetir: Integer;
  • begin
  • RESULT := '';
  • if chave = '' then chave := 'a'; // Mettre qque chose sinon ça va foiré ...
  • lengthChave := length(Chave);
  • lengthTexto := length(Texto);
  • if lengthChave < lengthTexto // La taille de la clé doit être au moins aussi grande que le message crypté ...
  • then begin
  • Repetir := 1;
  • for i := lengthChave + 1 to lengthTexto do
  • begin
  • Chave := chave + chave[Repetir];
  • if Repetir < lengthChave
  • then Repetir := Repetir + 1
  • else Repetir := 1;
  • end;
  • end;
  • for i := 1 to length(Texto) do
  • begin
  • curOrd := Ord(Texto[i]) XOR Ord(Chave[i]);
  • if curOrd = 0 // Ça arrive quand Texto[i] = Chave[i] ...
  • then curOrd := Ord(Texto[i]); // Chr(0) n' existe pas, donc on peut pas coder ce caractere ...
  • RESULT := RESULT + Chr(curOrd);
  • end;
  • end;
  • function VERNAM_DECRYPT(Criptado, Chave: String): String;
  • var i, repetir, curOrd, lengthChave, lengthTexto: Integer;
  • begin
  • RESULT := '';
  • if chave = '' then chave := 'a';
  • lengthChave := length(Chave);
  • lengthTexto := length(Criptado);
  • if lengthChave < lengthTexto
  • then begin
  • Repetir := 1;
  • for i := lengthChave + 1 to lengthTexto do
  • begin
  • Chave := chave + chave[Repetir];
  • if Repetir < lengthChave
  • then Repetir := Repetir + 1
  • else Repetir := 1;
  • end;
  • end;
  • for i := 1 to lengthTexto do
  • begin
  • curOrd := Ord(Criptado[i]) XOR Ord(Chave[i]);
  • if curOrd = 0 // On est dans le cas où Texto[i] était égal à Chave[i] ...
  • then curOrd := Ord(Criptado[i]); // Donc, la lettre ne fut pas cryptée ...
  • RESULT := RESULT + Chr(curOrd);
  • end;
  • end;
  • procedure TdbpVernam.SetAbout;
  • begin
  • // rien
  • end;
  • constructor TdbpVernam.Create(AOwner: TComponent);
  • begin
  • inherited Create(AOwner);
  • FAbout := 'v1.2 par Julio P. (Diabloporc), Mauricio (Fafe Portugal), RM50Man';
  • fFile := '';
  • fFileEncoded := '';
  • fFileDecoded := '';
  • fFileKey := '';
  • fUseFileKey := false;
  • fUseTextCle := false;
  • end;
  • procedure Register;
  • begin
  • RegisterComponents('Diabloporc', [TdbpVernam]);
  • end;
  • procedure TdbpVernam.SetFile(const Value: TFileName);
  • begin
  • if (not fileexists(Value)) and (length(value)>0) then exit;
  • fFile := Value;
  • end;
  • procedure TdbpVernam.SetFileDecoded(const Value: TFileName);
  • begin
  • if fFileDecoded=Value then exit;
  • fFileDecoded := Value;
  • end;
  • procedure TdbpVernam.SetFileEncoded(const Value: TFileName);
  • begin
  • if fFileEncoded=Value then exit;
  • fFileEncoded := Value;
  • end;
  • procedure TdbpVernam.SetFileKey(const Value: TFileName);
  • begin
  • if (not fileexists(Value)) and (length(value)>0) then exit;
  • fFileKey := Value;
  • end;
  • function TdbpVernam.EncodeFichier: boolean;
  • begin
  • if fFile='' then begin result := false; exit; end;
  • if fUseFileKey then
  • begin
  • if fFileKey='' then begin result := false; exit; end;
  • VERNAM_CRYPT_FILE_WITH_PREDEF_KEY(fFile, fFileEncoded+'.vn', fFileKey);
  • end
  • else
  • VERNAM_CRYPT_FILE(fFile, fFileEncoded+'.vn', fFile+'.vnk');
  • result := fileexists(fFileEncoded+'.vn');
  • end;
  • function TdbpVernam.DecodeFichier: boolean;
  • begin
  • if (fFile='') or (fFileKey='') then begin result := false; exit; end;
  • VERNAM_DECRYPT_FILE(fFile, fFileDecoded, fFileKey);
  • result := fileexists(fFileDecoded);
  • end;
  • function TdbpVernam.DecodeText: boolean;
  • begin
  • if (fText='') then begin result := false; exit; end;
  • fTextDecode := '';
  • fTextDecode := VERNAM_DECRYPT(fText, fTextCle);
  • result := fTextDecode <> '';
  • end;
  • function TdbpVernam.EncodeText: boolean;
  • begin
  • if (fText='') then begin result := false; exit; end;
  • if not fUseTextCle then
  • begin
  • fTextEncode := '';
  • fTextEncode := VERNAM_CRYPT(fText, fTextCle);
  • result := fTextEncode <> '';
  • end
  • else
  • begin
  • fTextEncode := '';
  • fTextEncode := VERNAM_CRYPT_WITH_PREDEF_KEY(fText, fTextCle);
  • result := fTextEncode <> '';
  • end;
  • end;
  • end.
{
################################################################################
# DBPVERNAM                                                                    #
################################################################################
#                                                                              #
# VERSION       : 1.2                                                          #
# FICHIERS      : dbpVernam.pas,.dcu,.dcr,.bmp,ReadMe.htm                      #
# AUTEUR        : Julio P. (Diabloporc)                                        #
# CREATION      : 09 dec 2004                                                  #
# MODIFIEE      : 10 dec 2004                                                  #
# SITE WEB      : http://diabloporc.free.fr                                    #
# MAIL          : diabloporc@laposte.net                                       #
# LEGAL         : Free sous Licence GNU/GPL                                    #
# INFOS         : Retrouvez moi sur www.delphifr.com : "JulioDelphi"           #
#                                                                              #
################################################################################
}

unit dbpVernam;

interface

uses
  Math, SysUtils, Classes;

type
  TdbpVernam = class(TComponent)
  private
    fText, fTextEncode, fTextDecode, fTextCle, fAbout: string;
    fFile, fFileEncoded, fFileDecoded, fFileKey: TFileName;
    fUseTextCle, fUseFileKey: boolean;

    procedure SetFile(const Value: TFileName);
    procedure SetFileEncoded(const Value: TFileName);
    procedure setFileDecoded(const Value: TFileName);
    procedure SetFileKey(const Value: TFileName);
    procedure SetAbout(const Value: string);

  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent);                       override;
  published
    property About:               String        read fAbout       write SetAbout;
    property Fichier:             TFileName     read fFile        write SetFile;
    property FichierEncode:       TFileName     read fFileEncoded write SetFileEncoded;
    property FichierDecode:       TFileName     read fFileDecoded write SetFileDecoded;
    property FichierCle:          TFileName     read fFileKey     write SetFileKey;
    property UtiliserFichierCle:  boolean       read fUseFileKey  write fUseFileKey;
    property Text:                string        read fText        write fText;
    property TextEncode:          string        read fTextEncode  write fTextEncode;
    property TextDecode:          string        read fTextDecode  write fTextDecode;
    property TextCle:             string        read fTextCle     write fTextCle;
    property UtiliserTextCle:     boolean       read fUseTextCle  write fUseTextCle;

    function EncodeFichier: boolean;
    function DecodeFichier: boolean;
    function EncodeText: boolean;
    function DecodeText: boolean;
  end;

procedure Register;

implementation
{$R dbpVernam.dcr}

procedure VERNAM_CRYPT_FILE(Src, Dest, Chave: TFileName);
var fs_Src, fs_Dest, fs_Chave: TFileStream;
    fs_Src_Buffer, fs_Dest_Buffer, fs_Chave_Buffer: Array[0..1023] of byte; // Buffers de 1Ko ...
    fs_Buffer_size: Int64;
    i: Integer;
begin
  Randomize;
  fs_Src   := TFileStream.Create(Src,   fmOpenRead or fmShareDenyWrite);
  fs_Dest  := TFileStream.Create(Dest,  fmCreate or fmShareExclusive);
  fs_Chave := TFileStream.Create(Chave, fmCreate or fmShareExclusive);

  Try
    While fs_Src.Position < fs_Src.Size Do
    begin
      fs_Buffer_size := fs_Src.Size - fs_Src.Position;

      If fs_Buffer_size > 1024
      Then fs_Buffer_size := 1024;

      fs_Src.Read(fs_Src_Buffer, fs_Buffer_size);

      for i := 0 to fs_Buffer_size - 1 do
      begin
        fs_Chave_Buffer[i] := RandomRange(0, 247);  // 1 byte = 8bits (1 octet en français) donc valeur max. est de 11111111 en binaire = 247 en décimal ...
        fs_Dest_Buffer[i]  := fs_Chave_Buffer[i] XOR fs_Src_Buffer[i];
      end;

      fs_Chave.Write(fs_Chave_Buffer, fs_Buffer_size);
      fs_Dest.Write(fs_Dest_Buffer, fs_Buffer_size);
    end;
  Finally
    fs_Src.Free;
    fs_Dest.Free;
    fs_Chave.Free;
  End;
end;

procedure VERNAM_CRYPT_FILE_WITH_PREDEF_KEY(Src, Dest, Chave: TFileName);
var fs_Src, fs_Dest, fs_Chave: TFileStream;
    fs_Src_Buffer, fs_Dest_Buffer, fs_Chave_Buffer, fs_Chave_Buffer2: Array[0..1023] of byte; // Buffers de 1Ko ...
    fs_Src_Buffer_size, fs_Chave_Buffer_size, TransfBytes: Int64;
    i: Integer;
begin
  Randomize;
  fs_Src   := TFileStream.Create(Src,   fmOpenRead or fmShareDenyWrite);
  fs_Dest  := TFileStream.Create(Dest,  fmCreate or fmShareExclusive);
  fs_Chave := TFileStream.Create(Chave, fmOpenRead or fmShareDenyWrite);

  Try
    While fs_Src.Position < fs_Src.Size Do
    begin
      fs_Src_Buffer_size := fs_Src.Size - fs_Src.Position;
      If fs_Src_Buffer_size > 1024
      Then fs_Src_Buffer_size := 1024;
      fs_Src.Read(fs_Src_Buffer, fs_Src_Buffer_size);

      // On doit contrôler la lecture du fichier clé parce que celui-ci peut être + petit que le fichier crypté !
      fs_Chave_Buffer_size := 0;
      While fs_Chave_Buffer_size < fs_Src_Buffer_size do   // On doit avoir le meme nombre de bytes ...
      begin
        TransfBytes := fs_Chave.Size - fs_Chave.Position;  // Bytes dispo à lire dans le fichier clé ...

        If TransfBytes = 0    // On est à la fin du fichier clé ...
        Then Begin
          fs_Chave.Seek(0, soFromBeginning);
          TransfBytes := fs_Chave.Size;
        End;

        If TransfBytes + fs_Chave_Buffer_size > fs_Src_Buffer_size
        Then TransfBytes := fs_Src_Buffer_size - fs_Chave_Buffer_size;

        fs_Chave.Read(fs_Chave_Buffer2, TransfBytes);      // Mémoire temporaire pour transférer vers fs_Chave_Buffer ...

        for i := 0 to TransfBytes - 1 do                   // Compléter le buffer de la clé ...
          fs_Chave_Buffer[fs_Chave_Buffer_size + i] := fs_Chave_Buffer2[i];

        fs_Chave_Buffer_size := fs_Chave_Buffer_size + TransfBytes;
      end;

      for i := 0 to fs_Src_Buffer_size - 1 do
        fs_Dest_Buffer[i]  := fs_Chave_Buffer[i] XOR fs_Src_Buffer[i];

      fs_Dest.Write(fs_Dest_Buffer, fs_Src_Buffer_size);
    end;
  Finally
    fs_Src.Free;
    fs_Dest.Free;
    fs_Chave.Free;
  End;
end;

procedure VERNAM_DECRYPT_FILE(Src, Dest, Chave: TFileName);
var fs_Src, fs_Dest, fs_Chave: TFileStream;
    fs_Src_Buffer, fs_Dest_Buffer, fs_Chave_Buffer, fs_Chave_Buffer2: Array[0..1023] of byte; // Buffers de 1Ko ...
    fs_Src_Buffer_size, fs_Chave_Buffer_size, TransfBytes: Int64;
    i: Integer;
begin
  fs_Src   := TFileStream.Create(Src,   fmOpenRead or fmShareDenyWrite);
  fs_Dest  := TFileStream.Create(Dest,  fmCreate or fmShareExclusive);
  fs_Chave := TFileStream.Create(Chave, fmOpenRead or fmShareDenyWrite);

  Try
    While fs_Src.Position < fs_Src.Size Do
    begin
      fs_Src_Buffer_size := fs_Src.Size - fs_Src.Position;
      If fs_Src_Buffer_size > 1024
      Then fs_Src_Buffer_size := 1024;
      fs_Src.Read(fs_Src_Buffer, fs_Src_Buffer_size);

      // On doit contrôler la lecture du fichier clé parce que celui-ci peut être + petit que le fichier crypté !
      fs_Chave_Buffer_size := 0;
      While fs_Chave_Buffer_size < fs_Src_Buffer_size do
      begin
        TransfBytes := fs_Chave.Size - fs_Chave.Position;  // Bytes dispo à lire dans le fichier clé ...

        If TransfBytes = 0    // On est à la fin du fichier clé ...
        Then Begin
          fs_Chave.Seek(0, soFromBeginning);
          TransfBytes := fs_Chave.Size;
        End;

        If TransfBytes + fs_Chave_Buffer_size > fs_Src_Buffer_size
        Then TransfBytes := fs_Src_Buffer_size - fs_Chave_Buffer_size;

        fs_Chave.Read(fs_Chave_Buffer2, TransfBytes);      // Mémoire temporaire pour transférer vers fs_Chave_Buffer ...

        for i := 0 to TransfBytes - 1 do                   // Compléter le buffer de la clé ...
          fs_Chave_Buffer[fs_Chave_Buffer_size + i] := fs_Chave_Buffer2[i];

        fs_Chave_Buffer_size := fs_Chave_Buffer_size + TransfBytes;
      end;

      for i := 0 to fs_Src_Buffer_size - 1 do
        fs_Dest_Buffer[i] := fs_Chave_Buffer[i] XOR fs_Src_Buffer[i];

      fs_Dest.Write(fs_Dest_Buffer, fs_Src_Buffer_size);
    end;
  Finally
    fs_Src.Free;
    fs_Dest.Free;
    fs_Chave.Free;
  End;
end;

function VERNAM_CRYPT(Texto: String; Var Chave: String): String;
var i, curOrd: Integer;
    RandomVal : byte;
begin
  RESULT := '';
  Chave  := '';
  Randomize;

  for i := 1 to length(Texto) do
  begin
    repeat
      RandomVal := RandomRange(1, 127);
      curOrd    := Ord(Texto[i]) XOR RandomVal;
    until curOrd <> 0;   // Ça foire si curOrd = 0 (Quand Ord(Texto[i]) = RandomVal)  parce que chr(0) n' existe pas !!!

    RESULT    := RESULT + Chr(curOrd);
    Chave     := Chave + chr(RandomVal);
  end;
end;

function VERNAM_CRYPT_WITH_PREDEF_KEY(Texto: String; Chave: String): String;
var i, curOrd, lengthChave, lengthTexto, repetir: Integer;
begin
  RESULT := '';

  if chave = '' then chave := 'a';    // Mettre qque chose sinon ça va foiré ...

  lengthChave := length(Chave);
  lengthTexto := length(Texto);

  if lengthChave < lengthTexto        // La taille de la clé doit être au moins aussi grande que le message crypté ...
  then begin
    Repetir := 1;
    for i := lengthChave + 1 to lengthTexto do
    begin
      Chave   := chave + chave[Repetir];

      if Repetir < lengthChave
      then Repetir := Repetir + 1
      else Repetir := 1;
    end;
  end;

  for i := 1 to length(Texto) do
  begin
    curOrd    := Ord(Texto[i]) XOR Ord(Chave[i]);

    if curOrd = 0                  // Ça arrive quand Texto[i] = Chave[i] ...
    then curOrd := Ord(Texto[i]);  // Chr(0) n' existe pas, donc on peut pas coder ce caractere ...

    RESULT    := RESULT + Chr(curOrd);
  end;
end;

function VERNAM_DECRYPT(Criptado, Chave: String): String;
var i, repetir, curOrd, lengthChave, lengthTexto: Integer;
begin
  RESULT := '';

  if chave = '' then chave := 'a';

  lengthChave := length(Chave);
  lengthTexto := length(Criptado);

  if lengthChave < lengthTexto
  then begin
    Repetir := 1;
    for i := lengthChave + 1 to lengthTexto do
    begin
      Chave  := chave + chave[Repetir];

      if Repetir < lengthChave
      then Repetir := Repetir + 1
      else Repetir := 1;
    end;
  end;

  for i := 1 to lengthTexto do
  begin
    curOrd := Ord(Criptado[i]) XOR Ord(Chave[i]);

    if curOrd = 0                      // On est dans le cas où Texto[i] était égal à Chave[i] ...
    then curOrd := Ord(Criptado[i]);   // Donc, la lettre ne fut pas cryptée ...

    RESULT := RESULT + Chr(curOrd);
  end;
end;

procedure TdbpVernam.SetAbout;
begin
// rien
end;

constructor TdbpVernam.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FAbout          := 'v1.2 par Julio P. (Diabloporc), Mauricio (Fafe Portugal), RM50Man';
 fFile           := '';
 fFileEncoded    := '';
 fFileDecoded    := '';
 fFileKey        := '';
 fUseFileKey     := false;
 fUseTextCle     := false;
end;

procedure Register;
begin
  RegisterComponents('Diabloporc', [TdbpVernam]);
end;

procedure TdbpVernam.SetFile(const Value: TFileName);
begin
 if (not fileexists(Value)) and (length(value)>0) then exit;
 fFile := Value;
end;

procedure TdbpVernam.SetFileDecoded(const Value: TFileName);
begin
 if fFileDecoded=Value then exit;
 fFileDecoded := Value;
end;

procedure TdbpVernam.SetFileEncoded(const Value: TFileName);
begin
 if fFileEncoded=Value then exit;
 fFileEncoded := Value;
end;

procedure TdbpVernam.SetFileKey(const Value: TFileName);
begin
 if (not fileexists(Value)) and (length(value)>0) then exit;
 fFileKey := Value;
end;

function TdbpVernam.EncodeFichier: boolean;
begin
 if fFile='' then begin result := false; exit; end;
 if fUseFileKey then
  begin
   if fFileKey='' then begin result := false; exit; end;
   VERNAM_CRYPT_FILE_WITH_PREDEF_KEY(fFile, fFileEncoded+'.vn', fFileKey);
  end
 else
  VERNAM_CRYPT_FILE(fFile, fFileEncoded+'.vn', fFile+'.vnk');

 result := fileexists(fFileEncoded+'.vn');
end;

function TdbpVernam.DecodeFichier: boolean;
begin
 if (fFile='') or (fFileKey='') then begin result := false; exit; end;
 VERNAM_DECRYPT_FILE(fFile, fFileDecoded, fFileKey);
 result := fileexists(fFileDecoded);
end;

function TdbpVernam.DecodeText: boolean;
begin
 if (fText='') then begin result := false; exit; end;
 fTextDecode := '';
 fTextDecode := VERNAM_DECRYPT(fText, fTextCle);
 result := fTextDecode <> '';
end;

function TdbpVernam.EncodeText: boolean;
begin
 if (fText='') then begin result := false; exit; end;
  if not fUseTextCle then
   begin
    fTextEncode := '';
    fTextEncode := VERNAM_CRYPT(fText, fTextCle);
    result := fTextEncode <> '';
   end
  else
   begin
    fTextEncode := '';
    fTextEncode := VERNAM_CRYPT_WITH_PREDEF_KEY(fText, fTextCle);
    result := fTextEncode <> '';
   end;
end;

end.

 Conclusion

Bugs, améliorations ? MP moi !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SCREENCAMTURE 0.2
Source avec Zip Source avec une capture JOUEZ : LIGHTS 1.4
Source avec Zip Source avec une capture FICLOCK : LOCKEZ LES FICHIERS
Source avec Zip Source avec une capture COMPOSANT TDBPTRACKBARVOLUME - JOUEZ AVEC LE SON !
Source avec Zip Source avec une capture COMPOSANT : TDBPLINKMAKER CREEZ DES .LNK

 Sources de la même categorie

Source avec Zip COMPOSANT THORLOGE par Michel34
Source avec Zip COMMANDS MANAGER - BESOIN DE COMMANDES DANS VOS PROGRAMMES T... par f0xi
Source avec Zip Source avec une capture COMPOSANT TZSIMAGE par ThWilliam
Source avec Zip Source avec une capture UTILISER LES COMPOSANTS PAR LEURS NUMÉROS par Dany3
Source avec Zip Source avec une capture TQGRID UN STRINGGRID AMÉLIORER. par yanb

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GOLDEN PASSWORDS - STOCKEZ VOS MOTS DE PASSE ! par Bacterius
Source avec Zip Source avec une capture LEA EN MODE CHIFFREMENT (SEA) par Bacterius
Source avec Zip Source avec une capture CRYPTAGE : MÉTHODE DE TRANSPOSITION par bad_dark_spirit
Source avec Zip Source avec une capture CRYPTAGE : MÉTHODE DE SUBSTITUTION par bad_dark_spirit
Source avec Zip Source avec une capture SOUNDCRYPT par craftsystem

Commentaires et avis

Commentaire de ni69 le 10/12/2004 13:55:26

Comme quoi le Vernam est sujet d'actualité ;)

Très bon code ! Merci de nous en faire profiter !
Il ira tout droit dans mon dossier 'compos utiles' ! :)

@+

Commentaire de MAURICIO le 10/12/2004 14:41:26

Non franchement, vous vous foutez du monde!
4 sources dans la page principale sur le cryptage VERNAM ...  Que du code repetitif en plus! C' est du n' importe quoi !!! Il manquerait plus qu' un compo sur le nain nouvelle version !!!!!

Ok, j' arrête la deconne, j' ai pas pu m' empecher de delirer !!!MDR!!! J' ai pu tester ce compo en avant 1ere, et c' est de la bombe à proton!!! Bravo pour le portage.

Y en a un qui va pas se marrer avec ce commentaire, mais faut prendre les choses dans le bon sens:
- Un source d' essai sur le cryptage VERNAM de Rm50man
- Une amelioration faites, par moi
- Cryptage de fichiers
- Phase ultime: le compo.
Un bon tutorial en somme.

PS: QQ' un veut faire un ActiveX de tout ça? Ok, elle est pas drôle ...

Commentaire de jmp77 le 10/12/2004 15:07:12

Bravo les gars et effectivement j'en connais un à qui cette nouvelle source sur le vernam va plaire enfin pour moi c'est un 10/10 et je range rapide ce compo tres utile.

Bonne prog,
JMP77.

Commentaire de grandvizir le 10/12/2004 18:12:01

Un krack pass Vernam ? Ben non, c'est plus dûr à faire que du Ctrl+C et Ctrl+V.

Hum...

8-|

Commentaire de MAURICIO le 10/12/2004 18:27:52

Que veux tu dire grandvizir?
Je comprends pas ...

Commentaire de ni69 le 10/12/2004 21:12:22

GrandVizir : Quelle est la signification de cette phrase ?

Commentaire de Inekman le 10/12/2004 21:57:16

Voilà une excellente initiative JulioDelphi :-P

J'espère qu'il y aura bientôt le cryptage des Stream ;-)

Inekman.10/10

Commentaire de MAURICIO le 13/12/2004 10:43:11

Oula,
arretez le delire !

C' est marrant que tout le monde parle de notes et de qui fait quoi, alors que cette source, inspirée d' un code de rm50man et par la suite adaptée par moi, ne succitent que des ondes qui perturbent mon PC ...
De ma part, le cryptage faisait parti de choses que je voulais voir et je pense que pour rm50man aussi!

Alors SVP, parlez de cryptage au alors, ça me fait presque regretter d' avoir déposé une source sur ce sujet.

PS: non, je ne suis pas fâché, juste un peu deçut surtout quand 'j' entends'  parler de poursuites pénales. Je pensais que sur delphifr, on faisait tous parti d' une petite famille .... Joyeux Noel à tous en tout cas ...

Commentaire de Nix le 13/12/2004 11:38:52 administrateur CS

Pour clore la discussion, les admins on accès à un outils que j'ai développé pour surveiller les lamers qui s'amusent à mettre des 1 partout sans raison.
Le pseudo ne permettant pas d'identifier une personne (pour en revenir plus haut) cela ne pose aucun problème.
Voilà maintenant s'il y a des candidats au ban, qu'il se manifeste et j'arrangerai ça

Si on laisse faire n'importe quoi cela va devenir l'anarchie et les admins sont là pour faire en sorte que tout se passe bien.

P.S : je vais virer les commentaire qui n'ont aucun rapport avec la source

Commentaire de MAURICIO le 13/12/2004 12:57:02

Salut Inekman, pour les streams, c presque pareil que pour les fichiers mais le problème (après réflexion), c que la clé doit être un fichier!!!
Prenons l' exemple dans lequel tu reçoit une image assez privée (ça va faire marrer JulioDelphi) sur le net (local ou pas) par stream, et bien, pour la décoder, tu dois avoir la clé ... E donc, la clé doit être un fichier que tu as avec toi. Je vais voir si g le temps et je poste la fonction ici en commentaire ...
PS: merci Nix!

Commentaire de Inekman le 13/12/2004 13:03:04

Dakodak chef :-P Après tout, c'était une idée pour compléter le truc :-) Essayer de potasser tout ça et vois si au final y'a un intérêt ou non ;-)

En tout cas, bravo pour ta réactivité.

Big up aussi à Nix qui doit malgré lui supporter toute les failles des comportements de certains.

Vive Delphi, et Joyeux Noël (?)...je sais pas si ça le fait avant l'heure...mais en tout cas joyeux -4 C° :-D

Commentaire de jmp77 le 13/12/2004 13:04:53

Oula je rentre de week end je reprends le boulot ce matin dur dur !!! et la tiens j'ouvre ma boite mail et je vois des dizaines de messages parlant de la source TDBPVernam. Je me dis oauis les gars ils ont kiffé je vais aller voir ce qu'ils en disent et ben j'étais pas deçu.
Bon je veux même pas rentrer dans la polimique je pense que tout a été dit.
Comme la si bien dit mauricio pour moi comme pour beaucoup delphifr c'est comme une petite famille avec comme principal lien de parenté delphi!!!

Alors merci à Mauricio et à JulioDelphi pour ce très bon code source et merci également à Nix pour avoir recentrer le débat.

Commentaire de JulioDelphi le 13/12/2004 13:07:41 administrateur CS

Mauricio : tu peux pas ecrire en fin de stream la clé ? comme ça pas besoin d'avoir un fichier !

Commentaire de Inekman le 13/12/2004 13:12:02

oh laa, bien vu ça Julio ;-) Allez Maurice, essaye ça :-D

Commentaire de MAURICIO le 13/12/2004 13:21:23

Et bien non les gars!!!
Pourquoi est-ce qu' on crypterai? Et bien au cas où qq' un choperai notre image par ex. sur le net !!! Donc, s' il chope la stream qui possède la clé, il pourra décrypter notre image top secret (MDR) !!!

Aller voir l' histoire des sous-marins sur les sources de VERNAM que j' ai posté !!! Le sous marins quand il quitte le port doit emporter le clé avec lui. Il ne peux pas la recevoir via ondes radio etc ... Sinon, l' ennemi chope le message et la clé !!!

Commentaire de JulioDelphi le 13/12/2004 13:25:36 administrateur CS

mmm ouè ok ça se tient :p

Commentaire de DRJEROME le 13/12/2004 18:13:53

Ah, voilà qui est mieux,

Bon on peut reprendre le Delphi

J'ai noté une petite coquille dans le commentaire, sans gravité :

"11111111 en binaire = 247"

à transformer en "11110111" ou alors mettre 255 à la place de 247

Pour les cryptages, il vaut mieux ne pas envoyer la clé en même temps c'est le principe de sécurité, il suffit de s'entendre à l'avance sur le code (par téléphone p'têt)

j'ai vu sur certains sites comment il "cassaient" les clés...


Commentaire de DorotheeJ le 13/12/2004 18:31:05

J'ai pour habitude d'écrire les différentes catégories de streams avec des pointeurs au niveau optimisation vitesse, y'a pas photo...surtout pour les grands fichiers

les lignes style  :

Chave    := chave + chave[Repetir];

sont très lentes à la longue, nous avions discuté de ce genre d'optimisation qui passe aussi par les pointeurs

nous av ons créé sur un autre site la fonction une fonction "inttobin" où on s'est rendu compte qu'on pouvait quadrupler les vitesses d'éxécution.

Je sais qu'on n'y pense pas toujours et que la technique demande plus de travail mais le jeu en vaut la chandelle

Voilà j'ai remis une note, mais celle-ci  restera secrète, je pense qu'elle encouragera toutefois JulioDelphi

Pour le reste, le code marche

Commentaire de Inekman le 13/12/2004 19:15:20

DorotheeJ -> as-tu un lien pour apprendre "facilement" à utiliser les pointeurs sous Delphi ? Ca m'intéresse ;-)

Commentaire de MAURICIO le 14/12/2004 11:36:37

N' oubliez pas, les pointeurs ont leurs jours comptés (.NET)!
De ma part, j' essaye de ne pas trop les utiliser parce que attention aux portages dans le futur (qui commence maintenant) !!!

Commentaire de Inekman le 14/12/2004 12:39:24

j'ai jamais utilisé les pointeurs, j'ai jamais vu leur intérêt :-P mais j'aurai aimé tâter la chose pour apprécier si oui ou non c good.

Commentaire de jmp77 le 14/12/2004 13:20:07

Tiens Inekaman si les pointeurs t'interesse vraiment regarde ceci pour commencer :

http://www.delphifr.com/codes/POINTEURS_SUR_TABLEAUX_DYNAMIQUES_ET_STATIQUES/25787.aspx

Bonne prog,
JMP77.

Commentaire de DorotheeJ le 14/12/2004 17:31:17

@Inekman

regarde là :

http://www.phidels.com/php/index.php3?page=../php/tutoriaux/pointeur.htm&id=287&PHPSESSID=d281c4dcd87622afae733ecb037247c0

il y a plein de lien sur les pointeurs sur les différents sites delphi j'irai voir celui de jmp77

Commentaire de DorotheeJ le 14/12/2004 17:32:12

de JMP77.

Commentaire de DorotheeJ le 14/12/2004 17:35:04

@Inekman :

pour les streams ici http://www.phidels.com/php/index.php3?page=../php/tutoriaux/streams2.htm&id=395&PHPSESSID=d281c4dcd87622afae733ecb037247c0

Commentaire de Inekman le 14/12/2004 18:03:18

Oh laaa les amis, tout à été bookmarké :-)

Merci à vous tous, je vais m'éclater ces vacances ;-)

Big up à vous tous.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Comment crypter un EXE? [ par Manthis ] Salut,je voudrais savoir comment crypter un fichier EXE alors si qqn as du source ou une DLL à me proposer je le remercie d'avance de tout coeur.Manth Coder un serveur smtp [ par SuperSonic ] Bonjour, ma question est simple.J'aimerais programmer un serveur smtp en delphi et j'aimerais en savoir un peu sur le protocole, enfin sur ce qu'il y recherche coder delphi [ par WaReD ] bon alors voila j aurais besoin d un bon coder en delphi, pour bossé sur un projet que j expliquerai par mail, et j ai dit un BON coder po une bréle d Cryptage MD2 MD4 MD5 [ par MAsterC ] Bonjour à tous! J'ai Delphi 7 et Borland C++ Builder 6 puis dans le logiciel C++ de Borland dans l'onglet "Indy - Divers" il y a Les composant de Cryptage MD5 [ par Kruger ] Bonjour tous le monde, je suis en train de develloper une petite application sous delphi 6 entreprise dont une partie est "protégée" par un mots de p Cryptage 128 bits [ par Artegon ] Salut a tous, j' aimerais savoir comment crypteune chaine de caractere en 128 bits...J' ai bien vus l' algorithme crypter/decrypter 128/256 bits, mais cryptage windows [ par ralfspark ] salut a tous j ai crypte certains fichier dans windows (comme mes photos), et apres reinstalation je ne peut plus les lire, que doit je faire ?merci cle de 128 bits et cryptage [ par MoveX ] une cle de 128 bits en cryptage ca correspond a quoi? je veux dire, ca n est pas une cle de 128 caracteres? crypter en delphi [ par sandroagboka ] je dispose d'un TIWEdit (composant d'IntraWeb)je r&#233;cup&#232;re le donn&#233;e dans une variable. ( password)comment crypter cette variable et ins Décrypter un fichier ZIP [ par kelian ] Salut salut donc mon probleme est un fichier crypter et ziper et il y a un pass donc ma question qui va etre stupide pour certain est commen d&#233;cr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales