Page 1 sur 2
Besoin d'aide bug cryptage [Résolu]
Publié : ven. 05/sept./2008 16:52
par Thyphoon
bon voilà j'ai un problème. Un bug qui me tient depuis des mois et je ne sais pas comment faire pour trouver ou est l'erreur.
Il s'agit de ma fonction d'encodage RC4 ... dans certain cas si j'encode un texte avec le mot de passe, et qu'ensuite je le decode, il comporte des erreurs.
voici le code qui vous montre le souci. a la fin du code j'ai une boucle ou je fabrique un texte aléatoirement et j'affiche dans le debugger lorsque le text decrypter de correspond au texte d'origine.
N'importe quel conseille, coup de pousse est le bienvenu
Merci
Code : Tout sélectionner
Structure prefs
cle.s
EndStructure
Global Prefs.prefs
;Function pour créer un mot de passe
Procedure.s mkpass(password_length)
Protected chars$,pass$,position.l,char_case.l,a.l
chars$="abcdefghijklmnopqrstuvwxyz1234567890" ; possible characters, keep these lcase
For a=1 To password_length
Select Random(1) ; 0 = char, 1 = digit
Case 1 ; is digit
pass$+Str(Random(9))
Case 0 ; is character
position=Random(Len(chars$)) ; random character selector
char_case = Random(10)
If char_case<5 ; less than 5 is ucase
pass$+UCase(Mid(chars$,position,1))
Else
pass$+Mid(chars$,position,1)
EndIf
EndSelect
Next
ProcedureReturn pass$
EndProcedure
Procedure.s RC4(Inp.s, Key.s)
;encoded.s = RC4("Message", "Password")
;decoded.s = RC4(encoded, "Password")
Protected i.l,j.l,t.l,x.l,temp.w,Y.w,Outp.s
Dim S.w(255)
Dim K.w(255)
i.l=0: j.l=0: t.l=0: x.l=0
temp.w=0: Y.w=0
Outp.s=""
For i = 0 To 255
S(i) = i
Next
j = 1
For i = 0 To 255
If j > Len(key)
j = 1
EndIf
K(i) = Asc(Mid(key, j, 1))
j = j + 1
Next i
j = 0
For i = 0 To 255
j = (j + S(i) + K(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
Next i
i = 0
j = 0
For x = 1 To Len(Inp)
i = (i + 1) & 255
j = (j + S(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
t = (S(i) + (S(j) & 255)) & 255
Y = S(t)
Outp = Outp + Chr(Asc(Mid(Inp, x, 1))!Y)
Next
ProcedureReturn Outp
EndProcedure
;********************
;Le choix du système de cryptage
;********************
Procedure.s CrypteText(Text.s)
ProcedureReturn RC4(Text.s, Prefs\Cle)
EndProcedure
Procedure.s DecrypteText(Text.s)
ProcedureReturn RC4(Text.s, Prefs\Cle)
EndProcedure
prefs\Cle="monmotdepasse"
For z=1 To 2000
;Debug "--"+Str(z)+"--"
txt.s=mkpass(Random(4)+2)
test.s=CrypteText(txt)
result.s=DecrypteText(test)
;Debug txt+" "+test+" "+result
If txt<>result
Debug Str(z)+" "+txt+" "+test+" "+result
EndIf
Next
Publié : mer. 10/sept./2008 19:30
par popstatic
voila, c'etait du a un probleme a la fois de meme nom de structures et de majuscules pas mises ou mises en trop dans des noms de variable
Code : Tout sélectionner
Structure pref
cle.s
EndStructure
Global Prefs.pref
;Function pour créer un mot de passe
Procedure.s mkpass(password_length)
Protected chars$,pass$,position.l,char_case.l,a.l
chars$="abcdefghijklmnopqrstuvwxyz1234567890" ; possible characters, keep these lcase
For a=1 To password_length
Select Random(1) ; 0 = char, 1 = digit
Case 1 ; is digit
pass$+Str(Random(9))
Case 0 ; is character
position=Random(Len(chars$)) ; random character selector
char_case = Random(10)
If char_case<5 ; less than 5 is ucase
pass$+UCase(Mid(chars$,position,1))
Else
pass$+Mid(chars$,position,1)
EndIf
EndSelect
Next
ProcedureReturn pass$
EndProcedure
Procedure.s RC4(Inp.s, Key.s)
;encoded.s = RC4("Message", "Password")
;decoded.s = RC4(encoded, "Password")
Protected i.l,j.l,t.l,x.l,temp.w,Y.w,Outp.s
Dim S.w(255)
Dim K.w(255)
i.l=0: j.l=0: t.l=0: x.l=0
temp.w=0: Y.w=0
Outp.s=""
For i = 0 To 255
S(i) = i
Next
j = 1
For i = 0 To 255
If j > Len(key)
j = 1
EndIf
K(i) = Asc(Mid(key, j, 1))
j = j + 1
Next i
j = 0
For i = 0 To 255
j = (j + S(i) + K(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
Next i
i = 0
j = 0
For x = 1 To Len(Inp)
i = (i + 1) & 255
j = (j + S(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
t = (S(i) + (S(j) & 255)) & 255
Y = S(t)
Outp = Outp + Chr(Asc(Mid(Inp, x, 1))!Y)
Next
ProcedureReturn Outp
EndProcedure
;********************
;Le choix du système de cryptage
;********************
Procedure.s CrypteText(Text.s)
ProcedureReturn RC4(Text.s, Prefs\cle)
EndProcedure
Procedure.s DecrypteText(Text.s)
ProcedureReturn RC4(Text.s, Prefs\cle)
EndProcedure
Prefs\cle="monmotdepasse"
For z=1 To 2
;Debug "--"+Str(z)+"--"
txt.s=mkpass(Random(4)+2)
Debug txt
test.s=CrypteText(txt)
result.s=DecrypteText(test)
;Debug txt+" "+test+" "+result
If txt<>result
Debug Str(z)+" "+txt+" "+test+" "+result
EndIf
Debug result
Next
Publié : mer. 10/sept./2008 21:57
par Oliv
popstatic a écrit :voila, c'etait du a un probleme a la fois de meme nom de structures et de majuscules pas mises ou mises en trop dans des noms de variable
Je n'ai pas regardé le code, mais ce que tu as dit me surprends : PB ne tiens pas compte de la casse donc les majuscules de jouent pas.
Pour les problèmes de nom de variables, le mot clef "EnableExplicit" permet souvent d'aider quand on ne trouve pas la source d'un bug (en tout cas pour moi

)
Publié : jeu. 11/sept./2008 6:54
par Thyphoon
Merci popstatic de t'intéresser a mon problème. Mais dans la boucle final, vas jusqu'a 2000 au lieu de 2. Tu verra qu'il y a toujours certain cas ou ça ne marche pas. Et je ne comprends toujours pas pourquoi.
Code : Tout sélectionner
For z=1 To 2000
;Debug "--"+Str(z)+"--"
txt.s=mkpass(Random(4)+2)
test.s=CrypteText(txt)
result.s=DecrypteText(test)
;Debug txt+" "+test+" "+result
If txt<>result
Debug Str(z)+" "+txt+" "+test+" "+result
EndIf
Next
Mon programme de départ est entièrement EnableExplicit.
J'avoue que je suis un peu désespéré sur ce code, pour regler ce probleme.

Publié : jeu. 11/sept./2008 9:17
par kelebrindae
Bonjour Thyphoon,
Jette un oeil à cette version de ta procédure "RC4", elle a l'air de marcher pour moi:
Code : Tout sélectionner
Procedure.s RC4(Inp.s, Key.s)
;encoded.s = RC4("Message", "Password")
;decoded.s = RC4(encoded, "Password")
Protected i.b,j.b,t.b,temp.b,Y.b,Outp.s
Protected x.l
Protected Dim S.b(255)
Protected Dim K.b(255)
i=0: j=0: t=0: x=0
temp=0: Y=0
Outp=""
For i = 0 To 255
S(i) = i
Next
x = 1
For i = 0 To 255
If x > Len(key)
x = 1
EndIf
K(i) = Asc(Mid(key, x, 1))
x + 1
Next i
j = 0
For i = 0 To 255
j = (j + S(i) + K(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
Next i
i = 0
j = 0
For x = 1 To Len(Inp)
i = (i + 1) & 255
j = (j + S(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
t = (S(i) + (S(j) & 255)) & 255
Y = S(t)
Outp = Outp + Chr( (Asc(Mid(Inp, x, 1))!Y)&255 )
Next
ProcedureReturn Outp
EndProcedure
Globalement, j'ai juste transformé tes variables .w en .b (puisque l'on traite des codes ASCII, on n'avait pas besoin de 2 octets; je crois que l'erreur venait de là: dans certains cas, les opérations binaires sur 2 octets n'étaient pas équivalentes à celles sur 1 octet) et ajouté un "&255" dans la constitution de la variable "Outp" pour convertir les valeurs résultantes de "-127 -> 127" en "0 -> 255".
Publié : jeu. 11/sept./2008 10:14
par Thyphoon
Merci beaucoup !
c'est génial !
Parcontre si j'ai besoin d'encoder des texte Unicode ? comment je dois procéder ?
Publié : jeu. 11/sept./2008 13:15
par kelebrindae
Je ne sais pas, je ne connais rien à l'Unicode...
L'Unicode est "double-byte"? => 2 octets par caractère? ça veut dire que ASC peut renvoyer des codes supérieurs à 255 ?
Si c'est le cas, je vois deux solutions:
- Soit tu encryptes le texte non pas caractère par caractère mais octet par octet => un caractère dans le texte d'origine donnerait lieu à deux caractères dans le fichier crypté; en terme de taille de fichier, ça revient au même, et le code reste sensiblement identique.
- Soit (mais alors là c'est du pifomètre pur) il faudrait essayer de remplacer les ".b" par de ".w" et les "255" par des "65535"...
Je pencherais plutôt pour la première solution: aucune raison de générer un fichier crypté conforme à Unicode, même si le fichier d'origine est Unicode.
Mais encore une fois, je n'y connais rien!

Publié : jeu. 11/sept./2008 14:12
par Thyphoon
Je ne sais pas, je ne connais rien à l'Unicode...
L'Unicode est "double-byte"? => 2 octets par caractère? ça veut dire que ASC peut renvoyer des codes supérieurs à 255 ?
oui c'est ça !
J'avoue que sur ce problème je m'arrache les cheveux depuis pas mal de temps. Car voilà j'encode des données pour les sauvegarder dans une base de donnée Sqlite. si je cryptais mon text byte a byte, je serais obliger de sauvegarder une zone mémoire et non un text. Or PB ne connait le type BLOB de sqlite qui permet d'avoir des données binaires. Ou alors une fois ma zone mémoire crypter,je dois la transformer en base64. Bref ça fait des mois que je manipule dans tout les sens, il y a toujours un truc qui merde !
J'ai essayer de remplacer les .b part des .w et les 255 part 65535 mais parfois j'ai des dépassement de tableau, je ne sais pas pourquoi... donc je continue a chercher une solution qui ne soit pas trop de la bidouille.
Si tu as une autre idée n'hesite pas !
Merci en tout cas !
Publié : ven. 12/sept./2008 10:59
par kelebrindae
Tu aurais un exemple de texte qui fait planter la procédure, que je regarde ça de plus près ?
Publié : ven. 12/sept./2008 12:57
par Thyphoon
Merci beaucoup c'est tres sympa
un text qui plante... et bien je prends plusieurs ligne sur la page suivante
http://www.montreal.ca.emb-japan.go.jp/jp/index_j.htm
Ou bien voilà
平成20年9月11日
平成21年度前期用教科書の申し込みについて 申込み方法等は こちら をご覧下さい。締切日は9月30日(火)です。平成21年度の小学1年生は、2002年(平成14年)4月2日から2003年(平成15年)4月1日の間に出生した方です
平成20年9月2日
日加修好80周年行事詳細をアップデートしました。
平成20年9月2日
文化関連行事をアップデートしました。
平成20年8月27日
9月1日(月)及び9月15日(月)は休館日です。
平成20年8月26日
食肉加工品への細菌(リステリア菌)混入を原因とする健康被害
平成20年8月19日
外国に居住中の方への「ねんきん特別便」に関するお知らせ
et je me suis fait un code vite fait pour tester
Code : Tout sélectionner
Procedure.s RC4(Inp.s, Key.s)
;encoded.s = RC4("Message", "Password")
;decoded.s = RC4(encoded, "Password")
Protected i.b,j.b,t.b,temp.b,Y.b,Outp.s
Protected x.l
Protected Dim S.b(255)
Protected Dim K.b(255)
i=0: j=0: t=0: x=0
temp=0: Y=0
Outp=""
For i = 0 To 255
S(i) = i
Next
x = 1
For i = 0 To 255
If x > Len(key)
x = 1
EndIf
K(i) = Asc(Mid(key, x, 1))
x + 1
Next i
j = 0
For i = 0 To 255
j = (j + S(i) + K(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
Next i
i = 0
j = 0
For x = 1 To Len(Inp)
i = (i + 1) & 255
j = (j + S(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
t = (S(i) + (S(j) & 255)) & 255
Y = S(t)
Outp = Outp + Chr( (Asc(Mid(Inp, x, 1))!Y)&255 )
Next
ProcedureReturn Outp
EndProcedure
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#Editor
#Encode
#Decode
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 218, 120, 578, 329, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
EditorGadget(#Editor, 10, 10, 560, 270)
ButtonGadget(#Encode, 10, 290, 90, 30, "Encode")
ButtonGadget(#Decode, 110, 290, 90, 30, "Decode")
EndIf
EndIf
EndProcedure
Key.s="monmotdepass";
Encode.s="mon text";
Debug RC4(Encode, Key.s)
Open_Window_0()
Repeat
Evenement = WaitWindowEvent()
If Evenement = #PB_Event_Gadget And EventType()=#PB_EventType_LeftClick
Select EventGadget()
Case #Encode
txt.s=GetGadgetText(#Editor)
Debug RC4(txt.s, "coucou")
Case #Decode
txt.s=GetGadgetText(#Editor)
SetGadgetText(#Editor,RC4(txt.s, Key.s))
Debug "Decode"
EndSelect
EndIf
Until Evenement = #PB_Event_CloseWindow
Edit: je crois qu'il y a un petit bug dans mon code avec la fenêtre car ça n'affichage pas le code codé ! je suis a la bourre j'ai un rendez vous au besoin je regarde apres...
Publié : ven. 12/sept./2008 14:53
par kelebrindae
Je viens de remarquer un truc: ma version de ta procédure RC4 ne fait strictement rien, la chaîne en sortie est égale à la chaîne en entrée!
Là, sur ce coup-là, je suis vraiment une tanche!
(

oh, la honte...

)
Publié : ven. 12/sept./2008 15:34
par Thyphoon
kelebrindae a écrit :Je viens de remarquer un truc: ma version de ta procédure RC4 ne fait strictement rien, la chaîne en sortie est égale à la chaîne en entrée!
Là, sur ce coup-là, je suis vraiment une tanche!
(

oh, la honte...

)
lollllll c'est ce que je viens de comprendre en remettant le nez dans le code lolllllll
Publié : ven. 12/sept./2008 20:02
par kelebrindae

Ouais, pas de doute, je t'ai bien aidé, là!
Bon, blague à part, je continue de regarder l'algo pour voir si j'arrive à le faire marcher; je te tiendrai au courant.
(Mais bon, vu mes résultats précédents, 'faut pas s'attendre à des miracles...

)
Publié : ven. 12/sept./2008 20:06
par Thyphoon
lolllllllllllll un grand merci de passé au tant de temps pour moi !
De mon côté je vais essayer de retrouver sur le forum anglais l'algo d'origine que j'avais trouvé ! je te tient au courant des que je l'ai retrouvé
Publié : ven. 12/sept./2008 20:12
par Thyphoon