Problème Ascii entre la lettre majuscule S et Z lors de cryptage par césar ...

Résolu
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006 - 5 janv. 2006 à 23:11
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006 - 7 janv. 2006 à 21:54
Bonsoir, je dois réaliser un petit programme qui me pernet de crypter/décrypter un mot à partir de la méthode de Jules César, le hic c'est que dans mon code lorsque j'encode une clé j'ai remarqué qu'il confond la lettre S et Z.
Exemple:
Mot à crypter: VANDALISME
Clé:7
Mot crypté: CHUKHSPGTL

or la bonne solution est : CHUKHSPZTL

la lettre S doit avoir avec une clé de +7 comme cryptage la lettre Z et dans mon code il m'indique que c'est la lettre G
Je ne trouve vraiment pas l'erreur
Voici la partie du code:

procedure TF_Substitution.BCryptClick(Sender: TObject);
var
i:integer;
Xascii,Yascii:byte;
x:char;
tcle:integer;
begin
LbCrypt.Caption := '';
LbDecrypt.Caption := '';
LbDecrypt.Caption := EMot.text;
Lchaine := length(EMot.text);
SetLength(tableau_new_chr, Lchaine+1);



for i:=1 to Lchaine+1 do
begin


x:=(EMot.text[i]);
Xascii :=ord(x);
Yascii :=(Xascii+strtoint(ECle.text))mod 89;


WHILE Yascii<65 DO
begin
Yascii := Yascii+strtoint(ECle.Text);
end;


tableau_new_chr[i]:= chr(Yascii);
end;


for i:= 1 to Lchaine do
begin
LbCrypt.caption := LbCrypt.caption + tableau_new_chr[i];
end;


end;

Merci pour votre aide, j'ai d'autres petits programmes à réaliser et ça fait une paire d'heures que je bloque là dessus malheureusement...

10 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 janv. 2006 à 03:00
Salut,
d'abord d'ou vient la valeur 89 ?


j'ai trouvé une solution : les Modifications sont en bleu


procedure TF_Substitution.BCryptClick(Sender: TObject);
var
i:integer;
Xascii,Yascii:byte;
x:char;
tcle:integer;
begin
LbCrypt.Caption := '';
LbDecrypt.Caption := '';
LbDecrypt.Caption := EMot.text;
Lchaine := length(EMot.text);
SetLength(tableau_new_chr, Lchaine+1);


TCle := strtoint(ECle.text);
for i:=1 to Lchaine do
begin


x:=EMot.text[i];
Xascii :=ord(x);
If (Xascii + TCle) <> 90 Then
Yascii :=(Xascii + TCle)mod 89
Else
Yascii := Xascii + TCle;


WHILE Yascii<65 DO
begin
Yascii := Yascii + TCle;
end;


tableau_new_chr[i]:= chr(Yascii);
end;


for i:= 1 to Lchaine do
begin
LbCrypt.caption := LbCrypt.caption + tableau_new_chr[i];
end;


end;







@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 janv. 2006 à 03:44
un petit soucis si la clef est égale à 0 où 26 ... donc correction :


procedure TF_Substitution
.Button1Click
(Sender
: TObject
);
var
i
:integer
;
Xascii
,Yascii
:byte
;
x
:char
;
tcle
:integer
;
begin
LbCrypt
.Caption
:=
'';
LbDecrypt
.Caption
:= EMot
.text
;
Lchaine
:= length
(EMot
.text
);
SetLength
(tableau_new_chr
, Lchaine
+1);
TCle
:= strtoint
(ECle
.text
);
for i
: =1
to Lchaine
do
begin
x
:= EMot
.text
[i
];
Xascii
:=ord
(x
)- Ord('@'); // Ord('@') 64 donc A 1 et Z = 26

Yascii
:=
(Xascii
+ TCle
)
Mod
26;
// 26 Lettres
If Yascii
=
0
Then Yascii
:=
26;
tableau_new_chr
[i
]:= chr
(Yascii
+ Ord
('@'));
end ;
for i
: =
1
to Lchaine
do
begin
LbCrypt
.caption
:= LbCrypt
.caption
+ tableau_new_chr
[i
];
end;
end;



@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 janv. 2006 à 03:32
il suffit de faire l'opération inverse de rajouter 26 si non on risque d'obtenir un résultat négatif. Pour l'espace c'est un autre problème il a comme code ASCII 32 donc pour le crypter sur une base de ['A'..'Z'] + Clé ça va être dur
ABCDEFGHIJKLMNOPQRSTUVWXYZ
||||||||||||||||||||||||||
TUVWXYZABCDEFGHIJKLMNOPQRS//+7ce n'est pas impossible mais ce ne sera plus un cryptage de Jules Ceasar (à mon avis) puisqu'il faudra élargir le champ au delà des 26 caractères de l'alphabet. Ex 32 + 7 39 Chr(39)" ' "
voilà c'est tout ce que je sais
Pour décrypter essaye ceci :

procedure TF_Substitution
.Button2Click
(Sender
: TObject
);
var
i
:integer
;
Xascii
,Yascii
:byte
;
x
:char
;
tcle
:integer
;
begin
LbCrypt
.Caption
: =
'';
LbDecrypt
.Caption
:= '';
Lchaine
:= length
(EMot
.text
);
SetLength
(tableau_new_chr
, Lchaine
+1);
TCle
:= strtoint
(ECle
.text
);
for i
: =1
to Lchaine
do
begin
x
:= EMot
.text
[i
];
// Le Mot Crypté
Xascii
:=ord
(x
)- Ord
('@');
Yascii
:=
((Xascii
- TCle
)+
26)
Mod
26;
If Yascii
=
0
Then Yascii
:=
26;
tableau_new_chr
[i
]:= chr
(Yascii
+ Ord
('@'));
end ;
for i
: =
1
to Lchaine
do
begin
LbDecrypt
.caption
:= LbDecrypt
.caption
+ tableau_new_chr
[i
];
end ;
EMot
.Text
: = LbDecrypt
.caption
;
end;



@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 janv. 2006 à 03:26
Un peut plus simple à comprendre :

procedure TF_Substitution
.Button1Click
(Sender
: TObject
);
var
i
:integer
;
Xascii
,Yascii
:byte
;
x
:char
;
tcle
:integer
;
begin
LbCrypt
.Caption
:=
'';
LbDecrypt
.Caption
:= EMot
.text
;
Lchaine
:= length
(EMot
.text
);
SetLength
(tableau_new_chr
, Lchaine
+1);
TCle
:= strtoint
(ECle
.text
);
for i
: =1
to Lchaine
do
begin
x
:= EMot
.text
[i
];
Xascii
:=ord
(x
)- Ord
('A');

Yascii
:=
(Xascii
+ TCle
)
Mod
26;
// 26 Lettres
If Yascii
=
0
Then Yascii
:=
26;
tableau_new_chr
[i
]:= chr
(Yascii
+ Ord
('A'));
end ;
for i
: =
1
to Lchaine
do
begin
LbCrypt
.caption
:= LbCrypt
.caption
+ tableau_new_chr
[i
];
end;
end;



@+
Cirec
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006
6 janv. 2006 à 22:05
C'est très gentil pour votre aide Merci !!
Bonne soirée
Cycy
0
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006
6 janv. 2006 à 23:26
J'ai un petit soucis avec le code, en cryptant il n'y a pas de problème mais en décryptant il y a un soucis, la lettre C à décrypter toujours clé 7 m'indique la lettre Ê, j'ai appliqué votre deuxième code qui est en effet plus simple, voici ce que ça donne en décryptage:
begin
LbCrypt.Caption := '';
LbDecrypt.Caption:='';
Lchaine := length(EMot.text);
SetLength(tableau_new_chr, Lchaine+1);
TCle := strtoint(ECle.text);
for i:=1 to Lchaine do
begin
x:=EMot.text[i];
Xascii :=ord(x)- Ord([mailto:'@' '@']);
Yascii := (Xascii + TCle) Mod 26;
If Yascii = 0 Then Yascii := 26;
tableau_new_chr[i]:= chr(Yascii - Ord([mailto:'@' '@']));
end;
for i:= 1 to Lchaine do
begin
LbDecrypt.caption := LbDecrypt.caption + tableau_new_chr[i];
end;


end;
0
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006
6 janv. 2006 à 23:32
De plus, je dois pouvoir appliquer le même code en considérant cette fois que l'on utilise 26 caractère alphabétiques tjrs en majuscule ainsi que le blanc donc modulo 27, Serait il possible de m'expliquer ce qui change lors de la codification décodification mis à part le modulo?? J'ai du mal à suivre, pourtant ça parrait si simple ...
Merci encore pour votre aide
Cycy
0
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006
7 janv. 2006 à 15:51
Encore milles merci!! Pour le cryptage en effet, je dois employer la méthode de substitution donc je ne pense pas non plus que cela soit possible je t'en remercie quand même, je vais essayer de me débrouiller avec les données que vous m'avez donné et puis on verra bien...

Bon week end
Cycy
0
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006
7 janv. 2006 à 21:50
Il n'est donc pas possible d'appliquer ce code donc des 26 lettres alphabétiques+espace sous la méthode de substitution ?? J'ai essayé mais je n'y arrive pas non plus, décidémment le cryptage c'est pas mon domaine... Ce n'est pas possible de passer donc du code Ascii 032 à 065----->090???
Il y a 27 caractères, si je ne tiens pas compte des codes entre le 032 ET le 034 ça pourrait marcher non ?? Tout en continuant à appliquer le même code que pour l'exemple ci-dessus??? Car en gros ça reprend mon exemple mais avec SP en plus ...
0
CYCY07 Messages postés 67 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 22 mai 2006
7 janv. 2006 à 21:54
Petite erreur, en ne tenant pas compte des ASCII 033 à 064, il me serait peut être possible d'appliquer le code... Mais ce serait alors Modulo 27 et le hic c qu'il y aurait un décalage pour tout alors???
ou alors à chaque boucle de la chaine , je pourrais faire Clé+1??
Vous en pensez quoi??
0
Rejoignez-nous