IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Chiffrement Rijndael - Transférer un code VB.net vers Delphi


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut Chiffrement Rijndael - Transférer un code VB.net vers Delphi
    Bonjour,

    J'ai un petit code à transférer de VB.Net vers Delphi (2010).
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function Encode(ByVal input As Byte()) As Byte()
        Try
          Dim tAES = New RijndaelManaged()
          tAES.Key = _MyOwnKey
          tAES.Mode = CipherMode.ECB
          tAES.Padding = PaddingMode.Zeros
          Dim encryptor = tAES.CreateEncryptor()
          Return encryptor.TransformFinalBlock(input, 0, input.Length)
        Catch ex As Exception
          Return Nothing
        End Try
      End Function

    J'ai installé LockBox, mais j'avoue que m'y perds un peu, il y a tellement de possibilités de chiffrement.

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu as une chance de cocu

    ECB AES 128 sans aucune lib, juste les API Windows

    Voir aussi : Usage de la bibliothèque Cryptlib ou tu y trouveras une TSLTAES128ECB qui a utilisé en PROD, idem c'est juste l'API de l'OS
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    Merci Shai pour la réponse.
    J'ai testé les deux solutions, mais bizarrement mon antivirus les bloques et classe les deux exe générés comme une menace. Avant d'ouvrir ce thread, j'ai lu que LockBox serait la solution magique, mais ....
    Est-ce qu'il y a une solution avec Lockbox?

    Merci encore.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Les exemples Lockbox sur Google sont foisons, tu n'as qu'à piocher, ayant toujours tout réussi avec WinCrypt, je n'ai pas besoin de ça

    TCryptographicLibrary + TCodec en définissant BlockCipherId et ChainModeId



    L'anti-virus qui détecte l'utilisation de WinCrypt qui est inclus à l'OS, c'est n'importe quoi !
    Même dans un projet neuf sans rien d'autres ?

    Peut-être extraire le strict nécessaire de JwaWinCrypt, en tout cas, si je devais le redévelopper, c'est ce que je ferais pour avoir le moins de dépendance que possible.

    un truc dans ce genre avec Indy que l'on trouve sur StackOverflow que j'écrirais orienté TStream mais voir si c'est détecté ou pas par l'AV.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    unit CryptoUtils;
     
    interface
     
    function AES128_Encrypt(const Value, Password: string): string;
    function AES128_Decrypt(const Value, Password: string): string;
     
    implementation
     
    uses
      SysUtils, Windows, IdCoderMIME, IdGlobal;
     
    //-------------------------------------------------------------------------------------------------------------------------
    //    Base64 Encode/Decode
    //-------------------------------------------------------------------------------------------------------------------------
     
    function Base64_Encode(Value: TBytes): string;
    var
      Encoder: TIdEncoderMIME;
    begin
      Encoder := TIdEncoderMIME.Create(nil);
      try
        Result := Encoder.EncodeBytes(TIdBytes(Value));
      finally
        Encoder.Free;
      end;
    end;
     
    function Base64_Decode(Value: string): TBytes;
    var
      Encoder: TIdDecoderMIME;
    begin
      Encoder := TIdDecoderMIME.Create(nil);
      try
        Result := TBytes(Encoder.DecodeBytes(Value));
      finally
        Encoder.Free;
      end;
    end;
     
    //-------------------------------------------------------------------------------------------------------------------------
    //    WinCrypt.h
    //-------------------------------------------------------------------------------------------------------------------------
     
    type
      HCRYPTPROV  = Cardinal;
      HCRYPTKEY   = Cardinal;
      ALG_ID      = Cardinal;
      HCRYPTHASH  = Cardinal;
     
    const
      _lib_ADVAPI32    = 'ADVAPI32.dll';
      CALG_SHA_256     = 32780;
      CALG_AES_128     = 26126;
      CRYPT_NEWKEYSET  = $00000008;
      PROV_RSA_AES     = 24;
      KP_MODE          = 4;
      CRYPT_MODE_CBC   = 1;
     
    function CryptAcquireContext(var Prov: HCRYPTPROV; Container: PChar; Provider: PChar; ProvType: LongWord; Flags: LongWord): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptAcquireContextW';
    function CryptDeriveKey(Prov: HCRYPTPROV; Algid: ALG_ID; BaseData: HCRYPTHASH; Flags: LongWord; var Key: HCRYPTKEY): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDeriveKey';
    function CryptSetKeyParam(hKey: HCRYPTKEY; dwParam: LongInt; pbData: PBYTE; dwFlags: LongInt): LongBool stdcall; stdcall; external _lib_ADVAPI32 name 'CryptSetKeyParam';
    function CryptEncrypt(Key: HCRYPTKEY; Hash: HCRYPTHASH; Final: LongBool; Flags: LongWord; pbData: PBYTE; var Len: LongInt; BufLen: LongInt): LongBool;stdcall;external _lib_ADVAPI32 name 'CryptEncrypt';
    function CryptDecrypt(Key: HCRYPTKEY; Hash: HCRYPTHASH; Final: LongBool; Flags: LongWord; pbData: PBYTE; var Len: LongInt): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDecrypt';
    function CryptCreateHash(Prov: HCRYPTPROV; Algid: ALG_ID; Key: HCRYPTKEY; Flags: LongWord; var Hash: HCRYPTHASH): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptCreateHash';
    function CryptHashData(Hash: HCRYPTHASH; Data: PChar; DataLen: LongWord; Flags: LongWord): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptHashData';
    function CryptReleaseContext(hProv: HCRYPTPROV; dwFlags: LongWord): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptReleaseContext';
    function CryptDestroyHash(hHash: HCRYPTHASH): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDestroyHash';
    function CryptDestroyKey(hKey: HCRYPTKEY): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDestroyKey';
     
    //-------------------------------------------------------------------------------------------------------------------------
     
    {$WARN SYMBOL_PLATFORM OFF}
     
    function __CryptAcquireContext(ProviderType: Integer): HCRYPTPROV;
    begin
      if (not CryptAcquireContext(Result, nil, nil, ProviderType, 0)) then
      begin
        if HRESULT(GetLastError) = NTE_BAD_KEYSET then
          Win32Check(CryptAcquireContext(Result, nil, nil, ProviderType, CRYPT_NEWKEYSET))
        else
          RaiseLastOSError;
      end;
    end;
     
    function __AES128_DeriveKeyFromPassword(m_hProv: HCRYPTPROV; Password: string): HCRYPTKEY;
    var
      hHash: HCRYPTHASH;
      Mode: DWORD;
    begin
      Win32Check(CryptCreateHash(m_hProv, CALG_SHA_256, 0, 0, hHash));
      try
        Win32Check(CryptHashData(hHash, PChar(Password), Length(Password) * SizeOf(Char), 0));
        Win32Check(CryptDeriveKey(m_hProv, CALG_AES_128, hHash, 0, Result));
        // Wine uses a different default mode of CRYPT_MODE_EBC
        Mode := CRYPT_MODE_CBC;
        Win32Check(CryptSetKeyParam(Result, KP_MODE, Pointer(@Mode), 0));
      finally
        CryptDestroyHash(hHash);
      end;
    end;
     
    function AES128_Encrypt(const Value, Password: string): string;
    var
      hCProv: HCRYPTPROV;
      hKey: HCRYPTKEY;
      lul_datalen: Integer;
      lul_buflen: Integer;
      Buffer: TBytes;
    begin
      Assert(Password <> '');
      if (Value = '') then
        Result := ''
      else begin
        hCProv := __CryptAcquireContext(PROV_RSA_AES);
        try
          hKey := __AES128_DeriveKeyFromPassword(hCProv, Password);
          try
            // allocate buffer space
            lul_datalen := Length(Value) * SizeOf(Char);
            Buffer := TEncoding.Unicode.GetBytes(Value + '        ');
            lul_buflen := Length(Buffer);
            // encrypt to buffer
            Win32Check(CryptEncrypt(hKey, 0, True, 0, @Buffer[0], lul_datalen, lul_buflen));
            SetLength(Buffer, lul_datalen);
            // base 64 result
            Result := Base64_Encode(Buffer);
          finally
            CryptDestroyKey(hKey);
          end;
        finally
          CryptReleaseContext(hCProv, 0);
        end;
      end;
    end;
     
    function AES128_Decrypt(const Value, Password: string): string;
    var
      hCProv: HCRYPTPROV;
      hKey: HCRYPTKEY;
      lul_datalen: Integer;
      Buffer: TBytes;
    begin
      Assert(Password <> '');
      if Value = '' then
        Result := ''
      else begin
        hCProv := __CryptAcquireContext(PROV_RSA_AES);
        try
          hKey := __AES128_DeriveKeyFromPassword(hCProv, Password);
          try
            // decode base64
            Buffer := Base64_Decode(Value);
            // allocate buffer space
            lul_datalen := Length(Buffer);
            // decrypt buffer to to string
            Win32Check(CryptDecrypt(hKey, 0, True, 0, @Buffer[0], lul_datalen));
            Result := TEncoding.Unicode.GetString(Buffer, 0, lul_datalen);
          finally
            CryptDestroyKey(hKey);
          end;
        finally
          CryptReleaseContext(hCProv, 0);
        end;
      end;
    end;
     
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    @Shai, j'ai utilisé ton code, mais malheureusement je ne tombe pas sur le résultat attendu. J'ai eu de la part de l'autre partenaire une simulation des données en entrée avec le résultat attendu, mais je tombe sur une donnée encryptée différente. Est-ce juste uine question de paramètres?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Faut vérifier, le bourrage, l'algo, le block de complément, faut un peu chercher et jouer sur les paramètres.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Optimisation de code vb.net Excel vers txt
    Par aka-kluster dans le forum VB.NET
    Réponses: 13
    Dernier message: 24/07/2009, 18h42
  2. Traduire un bout de code de c++ vers delphi
    Par pointer dans le forum Langage
    Réponses: 7
    Dernier message: 07/02/2009, 09h55
  3. Réponses: 4
    Dernier message: 26/11/2008, 13h59
  4. Traduction d'un code en C++ vers Delphi
    Par saidus dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2007, 16h55
  5. Convertion code Delphi.net vers C#
    Par RamDevTeam dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 31/03/2006, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo