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

Langage Delphi Discussion :

Calculer un hash Sha1 avec Capicom


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut Calculer un hash Sha1 avec Capicom
    Bonjour

    Je ne suis pas trés doué avec delphi et après bien des recherches infructueuses, je viens demander un peu d'aide.

    J'ai ecrit une routine pour signer un document avec un certificat digital. N'ayant pas réussi a faire fonctionner le Hash de capicom, je m'étais rabattu sur TinyHash et çà marche impec. Inconvenient majeur de tinyhash, il se base sur une dll qui n'est pas tojours à jour sur les NT et autres Windows 2000, mon client l'a demandé de revenir sur capicom.
    Voila le code qui merdoie
    (Source et HashedValue sont déclaré string)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          HashedData.Algorithm := CAPICOM_HASH_ALGORITHM_SHA1;
          HashedData.Hash(Source);
          HashValue:= HashedData.Value;
    Alos qu'anvec tinyhash j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         HashValue := SHA1ToStr( SHA1(Source) );
    TinyHash me donne la bonne valeur, mais pas capicom

    Je suis moins mauvais en vb, et l' équivalent en vb (qui donne le même résultat que tinyhash)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          HashedData.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1
          HashedData.Hash(StrConv(Source,VbFromUnicode))
          HashValue= HashedData.Value
    Voila, je pense que je vous ai donné toutes les infos. Qu'en pensez vous ?

    D'avance merci
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Es-tu sûr que c'est un AnsiString (soit un string) qu'il faut transmettre à la méthode Hash ?
    Avec un WideString qu'est-ce que cela donne ?

    Par exemple pour la chaine 'Developpez.com' quelle serait la valeur attendue ? Que je puisse faire quelques tests.

    @+ Claudius.

  3. #3
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Merci de ta réponse.
    J'ai essayé aussi, j'obtiens une valeur encore différente, mais toujours pas la bonne.

    J'ai trouvé sur sourceforge une unité en delphi pur qui calcule les Hash SHA1,
    Donc mon problème est résolu. mais pour ma propre gouverne, j'aurais bien aimé comprendre pourquoi çà ne marche pas. En fait c'est l'equivalent Delphi de la fonction Vb strConv(Variable,VbFromUniCode) qui me manquait.

    Je sais qu'il s'agit là d'un manque de connaissance sur les string UniCode. Malgré tout ce que j'en ai lu, j'ai toujours pas bien compris.

    Je marque le post comme résolu. Mais si quelqu'un a des précision, j'e serais très content.

    Mais pour répondre à ta question sur le Hash de 'Developpez.com', ca donne
    ec8101c4a41b1ea17b1cff8ed10bb2f409921d47
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Et bien en transmettant un WideString le résultat est correcte.

    J'ai utilisé ce code pour effectuer le test, un Edit pour le texte source, un bouton et un label pour afficher le résultat:
    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
    uses
      ComObj, Variants;
     
    function StringToWideString(const S: string): WideString;
    begin
      SetLength(Result, Length(S) div 2);
      Move(S[1], Result[1], Length(S));
    end;
     
    function HashData(const S: WideString): WideString;
    const
      CAPICOM_HASH_ALGORITHM_SHA1 = $00000000;
    var
      HashedData: Variant;
    begin
      HashedData := CreateOleObject('CAPICOM.HashedData');
      try
        HashedData.Algorithm := CAPICOM_HASH_ALGORITHM_SHA1;
        HashedData.Hash(S);
        Result := HashedData.Value;
      finally
        HashedData := Unassigned;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      lblSHA1.Caption := HashData(StringToWideString(Edit1.Text));
    end;
    @+ Claudius

  5. #5
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Merci de tout coeur.

    Moi j'avais fais une simple affectation du string à un wide string genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonWideString := MonString;
    Le truc qui me manquais, c'était ta fonction StringToWideString

    Super ,
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Delbeke Voir le message
    Super ,
    Avec plaisir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 02/05/2006, 21h17
  2. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18
  3. Calcul de hash problematique
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 26/12/2005, 15h56
  4. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 17h14
  5. Calcul d'un total avec Rave Report
    Par webbulls dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/05/2004, 13h46

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