Projet TOTP - code non fonctionnel demande d'aide
Publié : mar. 27/juin/2023 20:39
Bonjour la communauté Purebasic !
Je viens vers la communauté car je bloque depuis un moment sur la création d'une fonction de génération de code à usage unique "TOTP" (norme très présente maintenant sur divers sites et services)
le fameux codes valide 30 secondes et générer depuis les application "Google Authenticator" ou "Microsoft Authenticator" pour ne cité qu'eux.
Pour mes tests, j'ai installer l'application Google Auth, inventer une clé secrète et tester avec l'application et divers services en ligne la génération pour pouvoir ensuite comparer les résultats avec mon code source.
la clé secrète est : "HOTPTESTSUPERSECRET"
en base32 cela donne (norme d'affichage et de stockage pour tous les services) : "JBHVIUCUIVJVIU2VKBCVEU2FINJEKVA="
voici un site qui permet directement de générer un code valide :
"https://cable.ayra.ch/totp/#{%22c%22:%2 ... ,%22d%22:6}"
Voici les divers sites, sources que j'ai pu trouver :
https://www.purebasic.fr/english/viewto ... tp#p538931
(code de 2019, ne donne pas le bon résultat comparé à google auth ou le site cable.ayra.ch ci-dessus)
https://www.unixtime.fr/
https://blog.cybercod.com/2014/05/25/hotp-et-totp/
https://dumas.ccsd.cnrs.fr/dumas-02023261/document
https://www.ionos.fr/digitalguide/serve ... rite/totp/
https://fr.wikipedia.org/wiki/Mot_de_pa ... r_le_temps
Si une âme charitable veut bien m'aider ?
base32.pbi :
Je viens vers la communauté car je bloque depuis un moment sur la création d'une fonction de génération de code à usage unique "TOTP" (norme très présente maintenant sur divers sites et services)
le fameux codes valide 30 secondes et générer depuis les application "Google Authenticator" ou "Microsoft Authenticator" pour ne cité qu'eux.
Pour mes tests, j'ai installer l'application Google Auth, inventer une clé secrète et tester avec l'application et divers services en ligne la génération pour pouvoir ensuite comparer les résultats avec mon code source.
la clé secrète est : "HOTPTESTSUPERSECRET"
en base32 cela donne (norme d'affichage et de stockage pour tous les services) : "JBHVIUCUIVJVIU2VKBCVEU2FINJEKVA="
voici un site qui permet directement de générer un code valide :
"https://cable.ayra.ch/totp/#{%22c%22:%2 ... ,%22d%22:6}"
Voici les divers sites, sources que j'ai pu trouver :
https://www.purebasic.fr/english/viewto ... tp#p538931
(code de 2019, ne donne pas le bon résultat comparé à google auth ou le site cable.ayra.ch ci-dessus)
https://www.unixtime.fr/
https://blog.cybercod.com/2014/05/25/hotp-et-totp/
https://dumas.ccsd.cnrs.fr/dumas-02023261/document
https://www.ionos.fr/digitalguide/serve ... rite/totp/
https://fr.wikipedia.org/wiki/Mot_de_pa ... r_le_temps
Si une âme charitable veut bien m'aider ?
base32.pbi :
Code : Tout sélectionner
;site de test : https://www.dcode.fr/code-base-32
Procedure.s text_to_bin(texte.s)
Protected a.l,binaire.s
For a=1 To Len(texte.s)
binaire.s+RSet(Bin(Asc(Mid(texte.s,a,1)),#PB_Byte),8,"0")
Next a.l
ProcedureReturn binaire.s
EndProcedure
Procedure.s Bin_to_text(binaire.s)
Protected a.l,sortie.s
For a=1 To Len(binaire.s) Step 8
sortie.s+Chr(Val("%"+Mid(binaire.s,a,8)))
Next a.l
ProcedureReturn sortie.s
EndProcedure
Procedure.s Base32Encode(text.s)
Protected table.s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
Protected conv_binaire.s,a.l,b.l,scinder_cinq_bits.s,output.s
conv_binaire.s=text_to_bin(text.s)
For a.l=1 To Len(conv_binaire.s) Step 5
scinder_cinq_bits.s=LSet(Mid(conv_binaire.s,a,5),5,"0")
decimal.l=Val("%"+scinder_cinq_bits)+1
output.s+Mid(table.s,decimal.l,1)
Next a
While Not Len(output.s) % 8 =0
output.s+"="
Wend
ProcedureReturn output.s
EndProcedure
Procedure.s Base32Decode(text.s)
Protected base.s=RemoveString(text.s,"="),table.s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
Protected a.l,car.s,decimal.l,vb.s
For a.l=1 To Len(base.s)
car.s=Mid(base.s,a,1)
decimal.l=FindString(table.s,car.s)-1
chainebinaire.s+RSet(Bin(decimal.l),5,"0")
Next a.l
chainebinaire.s=Left(chainebinaire.s,Len(chainebinaire.s)-(Len(chainebinaire.s)%8))
output.s=Bin_to_text(chainebinaire.s)
ProcedureReturn output.s
EndProcedure
; Exemple d'utilisation
;encoded.s = Base32Encode("HOTPTESTSUPERSECRET")
;Debug "Texte encodé en base32 :"+ encoded.s
;decoded.s= Base32Decode(encoded.s)
;Debug "Base32 en Texte :"+decoded.s
;encoded.s = Base32Encode("Hello World!")
;Debug "Texte encodé en base32 :"+ encoded.s
;decoded.s= Base32Decode(encoded)
;Debug "Base32 en Texte :"+decoded.s