PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → Signature avec l’algorithme RSA-SHA256
Signature avec l’algorithme RSA-SHA256
Started by Lili05111991, Feb., 05 2021 10:10 AM - 9 replies
Registered member
48 messages
Posted on February, 05 2021 - 10:10 AM
Bonjour,
Dans le cadre d'un projet, je dois créer une signature.
Pour la faire, je dois utiliser la partie privée d'un certificat et l’algorithme RSA-SHA256 puis convertir en base64. Je dois alors obtenir une chaine de 345 caractères.
J'ai trouver comment crypter en SHA256 mais pas en RSA-SHA256.
Si quelqu'un a la solution, je suis preneuse.

Voici mon code actuellement :
monBufferRetour est un Buffer = chaineEntree // chaineEntree étant le texte à signer
bufCle est un Buffer = HashChaîne(HA_HMAC_SHA_256, unMotDePasse) // unMotDePasse étant la partie privée de mon certificat
monBufferRetour = Crypte(monBufferRetour, bufCle, crypteSécurisé)
monBufferRetour = Encode(monBufferRetour,encodeBASE64)

RENVOYER monBufferRetour


Merci d'avance

Aurélie

--
Aurélie - Analyste, développeur à la Mutuelle Complémentaire de la Ville de Paris
"Chercher n'est pas une chose et trouver une autre, mais le gain de la recherche, c'est la recherche même." - Saint Grégoire de Nysse
Registered member
3,875 messages
Popularité : +227 (347 votes)
Posted on February, 07 2021 - 9:39 AM
Bonjour,
Le chiffrement RSA est un chiffrement asymétrique, il faut donc utiliser la fonction suivante https://doc.pcsoft.fr/?1000024049&name=crypteasymetrique_fonction. (V24 mini)
La fonction crypte, à laquelle il faut préférer CrypteStandard ne gère que le chiffrement symétrique

--
Il y a peut être plus simple, mais, ça tourne
Registered member
48 messages
Posted on February, 17 2021 - 3:49 PM
Voroltinquo a écrit :
Bonjour,
Le chiffrement RSA est un chiffrement asymétrique, il faut donc utiliser la fonction suivantehttps://doc.pcsoft.fr/?1000024049&name=crypteasymetrique_fonction. (V24 mini)
La fonction crypte, à laquelle il faut préférer CrypteStandard ne gère que le chiffrement symétrique

--
Il y a peut être plus simple, mais, ça tourne



Bonjour,

Merci pour ton retour.
je vais regarder

Aurélie

--
Aurélie - Analyste, développeur à la Mutuelle Complémentaire de la Ville de Paris
"Chercher n'est pas une chose et trouver une autre, mais le gain de la recherche, c'est la recherche même." - Saint Grégoire de Nysse
Registered member
85 messages
Popularité : +2 (2 votes)
Posted on March, 05 2021 - 5:24 PM
Bonjour Aurélie

As-tu réussi ?
Nous avons exactement le même besoin de chiffrement asymétrique RSA (intégration de Jitsi système de visio)
et nous n'arrivons pas à obtenir les mêmes chiffrements que leur site de test


base64header,base64data sont des chaînes
base64header = Encode(header,encodeBASE64URL)
base64data = Encode(payloaddata,encodeBASE64URL)
base64header = ChaîneSupprime(base64header,"==")
base64data = ChaîneSupprime(base64data,"==")
bufacrypter est une Buffer = base64header +"."+ base64data
signature est un Buffer= CrypteAsymétriqueEnveloppé(bufacrypter,"D:\MesSites26\xxxxxxxx\xxxxxxx_WEB\FR\template\key\public.pub")
signature = HashChaîne(HA_SHA3_256,signature)
signature = Encode(signature,encodeBASE64URL)
signature = ChaîneSupprime(signature,"==")

jusqu'au buffer à crypter on est bon (base64header +"."+ base64data)
mais on obtient pas la même signature
(on a essayé sans le Enveloppé avant; mais pareil)

Merci de ta réponse
Registered member
48 messages
Posted on March, 08 2021 - 9:19 AM
Roumeg a écrit :
Bonjour Aurélie

As-tu réussi ?
Nous avons exactement le même besoin de chiffrement asymétrique RSA (intégration de Jitsi système de visio)
et nous n'arrivons pas à obtenir les mêmes chiffrements que leur site de test


base64header,base64data sont des chaînes
base64header = Encode(header,encodeBASE64URL)
base64data = Encode(payloaddata,encodeBASE64URL)
base64header = ChaîneSupprime(base64header,"==")
base64data = ChaîneSupprime(base64data,"==")
bufacrypter est une Buffer = base64header +"."+ base64data
signature est un Buffer= CrypteAsymétriqueEnveloppé(bufacrypter,"D:\MesSites26\xxxxxxxx\xxxxxxx_WEB\FR\template\key\public.pub")
signature = HashChaîne(HA_SHA3_256,signature)
signature = Encode(signature,encodeBASE64URL)
signature = ChaîneSupprime(signature,"==")

jusqu'au buffer à crypter on est bon (base64header +"."+ base64data)
mais on obtient pas la même signature
(on a essayé sans le Enveloppé avant; mais pareil)

Merci de ta réponse



Bonjour,

Oui nous avons réussi avec l'aide de PC SOFT mais notre solution n'est pas du 100% WINDEV.
En effet, dans notre projet la signature est particulière : elle se porte sur 2 références : le document métier et une balise présente dans la partie signature du flux.
Donc il a fallu que je créé mon document métier.
Puis que je lui ajoute le bloc signature.
Puis que je fasse appelle à une librairie en ligne de commande pour avoir un flux signé.

Si dans ton projet la signature ne se porte que sur le document métier alors voici ce qu'il faut faire :
- déjà ton document métier ne doit comporter aucun TAB ni RC
sCheminFichierCertificat est une chaîne = "*****.pfx" // chemin complet vers ton fichier pfx
sMotDePasseCertificat est une chaîne = "" //mot de passe du fichier pfx s'il y en a un
////******************** test du certificat
bufTestCertif est un buffer = CertificatSigneChaîne("test",sCheminFichierCertificat,sMotDePasseCertificat,certSignatureSeule +certSHA256)
SI ErreurDétectée ALORS
Erreur("Certificat non valide",ErreurInfo())
RETOUR
SINON
Trace("certificat OK")
FIN
//////********************
SignatureXml est un xmlSignature
//Méthode de standardisation C14N exclusive sans commentaire
SignatureXml..AlgorithmeNormalisation = atC14NExclu
//LIMITE ACTUELLE : HMAC SHA256 non disponible
//algorithme de cryptage RSA et algorithme de hachage de type SHA 256
SignatureXml..AlgorithmeSignature = asRSA_SHA_256
//certificat
SignatureXml..TypeFichierClé = tfcPKCS12 //Type du certificat
SignatureXml..Clé = sCheminFichierCertificat
SignatureXml..MotDePasseClé = sMotDePasseCertificat

//Ce qu'il faut signer
SignatureXml..Référence[1]..URI = "#" + sGUID //identifiant de la partie à signer préfixée de #
//et de quel façon il faut signer
SignatureXml..Référence[1]..Transformation[1] = atEnveloppée
SignatureXml..Référence[1]..Transformation[2] = atC14NExclu
SignatureXml..Référence[1]..AlgorithmeHash = HA_SHA_256

//LIMITE ACTUELLE : une des 3 informations "AvecCertificat", "AvecEmetteur" ou "AvecNomSujet" est obligatoire
x509 est un xmlSignatureInformationCléX509
x509..AvecCertificat = Faux
x509..AvecEmetteur = Faux
x509..AvecNomSujet = Faux
SignatureXml..InformationClé [1] = x509

//Signe le XML au niveau du noeud xmlDoc.Envelope.Body.ReponseIdb
SI PAS XMLSigne(SignatureXml,xmlDoc.Envelope.Body.ReponseIdb.Signature) ALORS
Erreur("Echec de la signature",ErreurInfo(errComplet))
SINON
//Contrôle visuel
SI EnModeTest() ALORS
Trace("************************ Contrôle visuel en mode test, XML APRES signature")
Trace(xmlDoc.ConstruitChaîne(XMLMiseEnForme))
Trace("************************")
FIN
xmlDoc.Sauve(fRepDonnées()+"destination_signee.xml")
FIN


En espérant que cela puisse t'aider

Aurélie

--
Aurélie - Analyste, développeur à la Mutuelle Complémentaire de la Ville de Paris
"Chercher n'est pas une chose et trouver une autre, mais le gain de la recherche, c'est la recherche même." - Saint Grégoire de Nysse
Posted on March, 08 2021 - 10:15 AM
Roumeg a écrit :
Bonjour Aurélie

As-tu réussi ?
Nous avons exactement le même besoin de chiffrement asymétrique RSA
(intégration de Jitsi système de visio)
et nous n'arrivons pas à obtenir les mêmes chiffrements que leur site de
test


base64header,base64data sont des chaînes
base64header = Encode(header,encodeBASE64URL)
base64data = Encode(payloaddata,encodeBASE64URL)
base64header = ChaîneSupprime(base64header,"==")
base64data = ChaîneSupprime(base64data,"==")
bufacrypter est une Buffer = base64header +"."+ base64data
signature est un Buffer=
CrypteAsymétriqueEnveloppé(bufacrypter,"D:\MesSites26\xxxxxxxx\xxxxxxx_WEB\FR\template\key\public.pub")
signature = HashChaîne(HA_SHA3_256,signature)
signature = Encode(signature,encodeBASE64URL)
signature = ChaîneSupprime(signature,"==")

jusqu'au buffer à crypter on est bon (base64header +"."+ base64data)
mais on obtient pas la même signature
(on a essayé sans le Enveloppé avant; mais pareil)

Merci de ta réponse


Bonjour,

Oui nous avons réussi avec l'aide de PC SOFT mais notre solution n'est pas du
100% WINDEV.
En effet, dans notre projet la signature est particulière : elle se porte sur
2 références : le document métier et une balise présente dans la partie
signature du flux.
Donc il a fallu que je créé mon document métier.
Puis que je lui ajoute le bloc signature.
Puis que je fasse appelle à une librairie en ligne de commande pour avoir un
flux signé.

Si dans ton projet la signature ne se porte que sur le document métier alors
voici ce qu'il faut faire :
- déjà ton document métier ne doit comporter aucun TAB ni RC
sCheminFichierCertificat est une chaîne = "*****.pfx" // chemin complet vers
ton Fichier pfx
sMotDePasseCertificat est une chaîne = "" //mot de passe du fichier pfx s'il
y en a un
////******************** test du certificat
bufTestCertif est un buffer =
CertificatSigneChaîne("test",sCheminFichierCertificat,sMotDePasseCertificat,certSignatureSeule
+certSHA256)
SI ErreurDétectée ALORS
Erreur("Certificat non valide",ErreurInfo())
RETOUR
SINON
Trace("certificat OK")
FIN
//////******************** SignatureXml est un xmlSignature //Méthode de
standardisation C14N exclusive sans commentaire
SignatureXml..AlgorithmeNormalisation = atC14NExclu
//LIMITE ACTUELLE : HMAC SHA256 non disponible
//algorithme de cryptage RSA et algorithme de hachage de type SHA 256
SignatureXml..AlgorithmeSignature = asRSA_SHA_256 //certificat
SignatureXml..TypeFichierClé = tfcPKCS12 //Type du certificat
SignatureXml..Clé = sCheminFichierCertificat
SignatureXml..MotDePasseClé = sMotDePasseCertificat

//Ce qu'il faut signer
SignatureXml..Référence[1]..URI = "#" + sGUID //identifiant de la partie
à signer préfixée de #
//et de quel façon il faut signer
SignatureXml..Référence[1]..Transformation[1] = atEnveloppée
SignatureXml..Référence[1]..Transformation[2] = atC14NExclu
SignatureXml..Référence[1]..AlgorithmeHash = HA_SHA_256

//LIMITE ACTUELLE : une des 3 informations "AvecCertificat", "AvecEmetteur"
OU "AvecNomSujet" est obligatoire
x509 est un xmlSignatureInformationCléX509 x509..AvecCertificat = Faux
x509..AvecEmetteur = Faux
x509..AvecNomSujet = Faux
SignatureXml..InformationClé [1] = x509

//Signe le XML au niveau du noeud xmlDoc.Envelope.Body.ReponseIdb
SI PAS XMLSigne(SignatureXml,xmlDoc.Envelope.Body.ReponseIdb.Signature) ALORS
Erreur("Echec de la signature",ErreurInfo(errComplet))
SINON
//Contrôle visuel
SI EnModeTest() ALORS
Trace("************************ Contrôle visuel en mode test, XML APRES
signature")
Trace(xmlDoc.ConstruitChaîne(XMLMiseEnForme))
Trace("************************")
FIN
xmlDoc.Sauve(fRepDonnées()+"destination_signee.xml")
FIN


En espérant que cela puisse t'aider

Aurélie


Merci beaucoup Aurélie pour ta réponse.
Nous allons étudier cela de près.
Effectivement il me semble que mon developpeur m'a parlé de TAB et de
RC et il se demandait s'il ne devait pas nettoyer tout cela.

On regarde et on fera un retour
Merci encore de ton aide?

(sinon dommage que ton post initial ne se trouve pas ds le forum
global, je ne l'avais pas trouvé au début, d'autant que ce susjet ets
d'actualité quelque soit la vs)

--
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Posted on March, 08 2021 - 12:02 PM
Roumeg a écrit :
Bonjour Aurélie

As-tu réussi ?
Nous avons exactement le même besoin de chiffrement asymétrique RSA
(intégration de Jitsi système de visio)
et nous n'arrivons pas à obtenir les mêmes chiffrements que leur site de
test


base64header,base64data sont des chaînes
base64header = Encode(header,encodeBASE64URL)
base64data = Encode(payloaddata,encodeBASE64URL)
base64header = ChaîneSupprime(base64header,"==")
base64data = ChaîneSupprime(base64data,"==")
bufacrypter est une Buffer = base64header +"."+ base64data
signature est un Buffer=
CrypteAsymétriqueEnveloppé(bufacrypter,"D:\MesSites26\xxxxxxxx\xxxxxxx_WEB\FR\template\key\public.pub")
signature = HashChaîne(HA_SHA3_256,signature)
signature = Encode(signature,encodeBASE64URL)
signature = ChaîneSupprime(signature,"==")

jusqu'au buffer à crypter on est bon (base64header +"."+ base64data)
mais on obtient pas la même signature
(on a essayé sans le Enveloppé avant; mais pareil)

Merci de ta réponse


Bonjour,

Oui nous avons réussi avec l'aide de PC SOFT mais notre solution n'est pas du
100% WINDEV.
En effet, dans notre projet la signature est particulière : elle se porte sur
2 références : le document métier et une balise présente dans la partie
signature du flux.
Donc il a fallu que je créé mon document métier.
Puis que je lui ajoute le bloc signature.
Puis que je fasse appelle à une librairie en ligne de commande pour avoir un
flux signé.

Si dans ton projet la signature ne se porte que sur le document métier alors
voici ce qu'il faut faire :
- déjà ton document métier ne doit comporter aucun TAB ni RC
sCheminFichierCertificat est une chaîne = "*****.pfx" // chemin complet vers
ton Fichier pfx
sMotDePasseCertificat est une chaîne = "" //mot de passe du fichier pfx s'il
y en a un
////******************** test du certificat
bufTestCertif est un buffer =
CertificatSigneChaîne("test",sCheminFichierCertificat,sMotDePasseCertificat,certSignatureSeule
+certSHA256)
SI ErreurDétectée ALORS
Erreur("Certificat non valide",ErreurInfo())
RETOUR
SINON
Trace("certificat OK")
FIN
//////******************** SignatureXml est un xmlSignature //Méthode de
standardisation C14N exclusive sans commentaire
SignatureXml..AlgorithmeNormalisation = atC14NExclu
//LIMITE ACTUELLE : HMAC SHA256 non disponible
//algorithme de cryptage RSA et algorithme de hachage de type SHA 256
SignatureXml..AlgorithmeSignature = asRSA_SHA_256 //certificat
SignatureXml..TypeFichierClé = tfcPKCS12 //Type du certificat
SignatureXml..Clé = sCheminFichierCertificat
SignatureXml..MotDePasseClé = sMotDePasseCertificat

//Ce qu'il faut signer
SignatureXml..Référence[1]..URI = "#" + sGUID //identifiant de la partie
à signer préfixée de #
//et de quel façon il faut signer
SignatureXml..Référence[1]..Transformation[1] = atEnveloppée
SignatureXml..Référence[1]..Transformation[2] = atC14NExclu
SignatureXml..Référence[1]..AlgorithmeHash = HA_SHA_256

//LIMITE ACTUELLE : une des 3 informations "AvecCertificat", "AvecEmetteur"
OU "AvecNomSujet" est obligatoire
x509 est un xmlSignatureInformationCléX509 x509..AvecCertificat = Faux
x509..AvecEmetteur = Faux
x509..AvecNomSujet = Faux
SignatureXml..InformationClé [1] = x509

//Signe le XML au niveau du noeud xmlDoc.Envelope.Body.ReponseIdb
SI PAS XMLSigne(SignatureXml,xmlDoc.Envelope.Body.ReponseIdb.Signature) ALORS
Erreur("Echec de la signature",ErreurInfo(errComplet))
SINON
//Contrôle visuel
SI EnModeTest() ALORS
Trace("************************ Contrôle visuel en mode test, XML APRES
signature")
Trace(xmlDoc.ConstruitChaîne(XMLMiseEnForme))
Trace("************************")
FIN
xmlDoc.Sauve(fRepDonnées()+"destination_signee.xml")
FIN


En espérant que cela puisse t'aider

Aurélie


Merci beaucoup de ton intervention car cela semble solutionner notre
problème.
En fait cela nous a orienté vers l'utilisation de openssl en ligne de
commande pour chiffrer la signature
et il semblerait que l'on retrouve bien les bonnes valeurs

Merci encore.

--
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Registered member
48 messages
Posted on March, 08 2021 - 2:34 PM
Roumegou a écrit :
Roumeg a écrit :
Bonjour Aurélie

As-tu réussi ?
Nous avons exactement le même besoin de chiffrement asymétrique RSA
(intégration de Jitsi système de visio)
et nous n'arrivons pas à obtenir les mêmes chiffrements que leur site de
test


base64header,base64data sont des chaînes
base64header = Encode(header,encodeBASE64URL)
base64data = Encode(payloaddata,encodeBASE64URL)
base64header = ChaîneSupprime(base64header,"==")
base64data = ChaîneSupprime(base64data,"==")
bufacrypter est une Buffer = base64header +"."+ base64data
signature est un Buffer=
CrypteAsymétriqueEnveloppé(bufacrypter,"D:\MesSites26\xxxxxxxx\xxxxxxx_WEB\FR\template\key\public.pub")
signature = HashChaîne(HA_SHA3_256,signature)
signature = Encode(signature,encodeBASE64URL)
signature = ChaîneSupprime(signature,"==")

jusqu'au buffer à crypter on est bon (base64header +"."+ base64data)
mais on obtient pas la même signature
(on a essayé sans le Enveloppé avant; mais pareil)

Merci de ta réponse


Bonjour,

Oui nous avons réussi avec l'aide de PC SOFT mais notre solution n'est pas du
100% WINDEV.
En effet, dans notre projet la signature est particulière : elle se porte sur
2 références : le document métier et une balise présente dans la partie
signature du flux.
Donc il a fallu que je créé mon document métier.
Puis que je lui ajoute le bloc signature.
Puis que je fasse appelle à une librairie en ligne de commande pour avoir un
flux signé.

Si dans ton projet la signature ne se porte que sur le document métier alors
voici ce qu'il faut faire :
- déjà ton document métier ne doit comporter aucun TAB ni RC
sCheminFichierCertificat est une chaîne = "*****.pfx" // chemin complet vers
ton fichier pfx
sMotDePasseCertificat est une chaîne = "" //mot de passe du fichier pfx s'il
y en a un
////******************** test du certificat
bufTestCertif est un buffer =
CertificatSigneChaîne("test",sCheminFichierCertificat,sMotDePasseCertificat,certSignatureSeule
+certSHA256)
SI ErreurDétectée ALORS
Erreur("Certificat non valide",ErreurInfo())
RETOUR
SINON
Trace("certificat OK")
FIN
//////******************** SignatureXml est un xmlSignature //Méthode de
standardisation C14N exclusive sans commentaire
SignatureXml..AlgorithmeNormalisation = atC14NExclu
//LIMITE ACTUELLE : HMAC SHA256 non disponible
//algorithme de cryptage RSA et algorithme de hachage de type SHA 256
SignatureXml..AlgorithmeSignature = asRSA_SHA_256 //certificat
SignatureXml..TypeFichierClé = tfcPKCS12 //Type du certificat
SignatureXml..Clé = sCheminFichierCertificat
SignatureXml..MotDePasseClé = sMotDePasseCertificat

//Ce qu'il faut signer
SignatureXml..Référence[1]..URI = "#" + sGUID //identifiant de la partie
à signer préfixée de #
//et de quel façon il faut signer
SignatureXml..Référence[1]..Transformation[1] = atEnveloppée
SignatureXml..Référence[1]..Transformation[2] = atC14NExclu
SignatureXml..Référence[1]..AlgorithmeHash = HA_SHA_256

//LIMITE ACTUELLE : une des 3 informations "AvecCertificat", "AvecEmetteur"
ou "AvecNomSujet" est obligatoire
x509 est un xmlSignatureInformationCléX509 x509..AvecCertificat = Faux
x509..AvecEmetteur = Faux
x509..AvecNomSujet = Faux
SignatureXml..InformationClé [1] = x509

//Signe le XML au niveau du noeud xmlDoc.Envelope.Body.ReponseIdb
SI PAS XMLSigne(SignatureXml,xmlDoc.Envelope.Body.ReponseIdb.Signature) ALORS
Erreur("Echec de la signature",ErreurInfo(errComplet))
SINON
//Contrôle visuel
SI EnModeTest() ALORS
Trace("************************ Contrôle visuel en mode test, XML APRES
signature")
Trace(xmlDoc.ConstruitChaîne(XMLMiseEnForme))
Trace("************************")
FIN
xmlDoc.Sauve(fRepDonnées()+"destination_signee.xml")
FIN


En espérant que cela puisse t'aider

Aurélie


Merci beaucoup de ton intervention car cela semble solutionner notre
problème.
En fait cela nous a orienté vers l'utilisation de openssl en ligne de
commande pour chiffrer la signature
et il semblerait que l'on retrouve bien les bonnes valeurs

Merci encore.

--
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus



Je t'en prie

Aurélie

--
Aurélie - Analyste, développeur à la Mutuelle Complémentaire de la Ville de Paris
"Chercher n'est pas une chose et trouver une autre, mais le gain de la recherche, c'est la recherche même." - Saint Grégoire de Nysse
Posted on January, 24 2022 - 7:47 PM
Bonjour,
J'ai lu avec intérêt votre réponse, auriez-vous un exemple de code pour l'utilisation de openssl via webdev ?
Merci d'avance
Registered member
3 messages
Posted on February, 24 2022 - 1:24 PM
//What must be signed
SignatureXml..Reference[1]..URI = "#" + sGUID //identifier of the part
to be signed prefixed with #
//and how to sign
SignatureXml..Reference[1]..Transformation[1] = atEnveloped
SignatureXml..Reference[1]..Transformation[2] = atC14NExcluded
SignatureXml..Reference[1]..AlgorithmHash = HA_SHA_256

//CURRENT LIMIT: one of the 3 pieces of information "WithCertificate", "WithIssuer"
or "WithSubjectName" is mandatory
x509 is xmlSignatureKeyInformationX509 x509..WithCertificate = False
x509..WithIssuer = False
x509..WithSubjectName = False
SignatureXml..KeyInformation [1] = x509

//Sign the XML at node level xmlDoc.Envelope.Body.ResponseIdb
IF NOT XMLSigne(SignatureXml,xmlDoc.Envelope.Body.ResponseIdb.Signature) THEN
Error("Signature failed",ErrorInfo(errComplete))
ELSE
//Visual check
IF InTestMode() THEN
Trace("****** ****************** Visual inspection in test mode, XML AFTER
signature")
Trace(xmlDoc.BuildString(XMLFormat))
Trace("********** ***************")
END