Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
- Accueil
- » Programmation
- » Casser un chiffre de César avec Fortran
- » Répondre
Répondre
Résumé de la discussion (messages les plus récents en premier)
- DrStone
- 11-02-2024 15:09:54
Mais de rien gielev.
Tu as fait vite d'ailleurs. Personnellement, préférant rester sur des langages de programmation dans lesquels on "programme" ; je n'ai pas spécialement pris la peine d'essayer de comprendre un tel langage qui cache beaucoup de complexité derrière quelques caractères qui font tout, y compris le café, tout en étant incompréhensible par quasiment tout le monde, toi y compris d'ici quelques semaines à mois. Il suffit de voir l’interpréteur pour se rendre compte du boxon sans nom que c'est : https://github.com/tomtheisen/stax/blob … xecutor.cs
Ou bien, peut-être suis-je simplement vieux jeu ?
Quoi qu'il en soit ne tient pas compte de mon avis, et amuse-toi bien avec tout ce qui te fait vibrer : la vie est trop courte pour écouter les grincheux comme moi. :=)
- gielev
- 10-02-2024 15:32:57
On peut tout faire, cher gielev !
J'aime beaucoup CodeGolf sur lequel je passe beaucoup trop de temps à implémenter mes propres solutions (les plus courtes) aux problèmes postés. Si jamais tu veux (comme moi) t'amuser à programmer des trucs inutilement court, voici le lien concernant le chiffrement de César.
Merci. Je ne connaissais pas ces challenges.
Le truc le plus "génial" est le SFAX sur 2 bytes.
Mais je n'ai pas encore compris la façon d'accéder à ce qui se cache derrière " ç' "
A voir de plus près...
Edit : c'est fait
éÉ╗;l¶m«á╧Jφµ¶ Ö·/53≈f─ü◙╫╙ù├├Ñ╦º]£~â┌╣▒P
- DrStone
- 10-02-2024 01:26:59
On peut tout faire, cher gielev !
J'aime beaucoup CodeGolf sur lequel je passe beaucoup trop de temps à implémenter mes propres solutions (les plus courtes) aux problèmes postés. Si jamais tu veux (comme moi) t'amuser à programmer des trucs inutilement court, voici le lien concernant le chiffrement de César.
En ce qui concerne le problème d'Ernst, le plus simple en restant sur ma méthode de fréquences et dictionnaire, serait de tester toutes les possibilités en décalant les lettres une a une en cycle (la première passe à la fin, puis la seconde [devenue première] passe à la fin, … où inversement, voir mieux, on teste les deux sens) jusqu'à qu'on tombe sur quelque chose de cohérent. Par contre on passe potentiellement en $O(n\times m)$ où $n$ est la taille du dictionnaire et $m$ la taille de la chaine de caractère ; en lieu et place de $O(n)$ précédemment.
- gielev
- 09-02-2024 22:53:05
Ça reste une solution viable mais gourmande en ressource. À ce niveau-là, il vaut peut-être mieux tester les 25 possibilités. En revanche, je reconnais que c'est très formateur comme façon de faire !
En effet, on peut faire très court
18 lignes en Fortran
PROGRAM Cesar
IMPLICIT NONE
integer m,n
character(:),allocatable :: chaine
character(len=1000) :: crypto
write(*,*)'Déchiffrage du chiffre de César : entrez votre crypto EN MAJUSCULES et SANS ESPACES(limité à 1000 caractères)'
read(*,*)crypto
chaine=trim(crypto)
do m=1,26
do n=1,len(chaine)
if(ichar(chaine(n:n))>=90) then
chaine(n:n) = achar(64)
endif
chaine(n:n)=achar(ichar(chaine(n:n))+1)
enddo
write(*,*)m,' ',chaine
enddo
end program Cesar
6 seulement en Python !
cryptogramme=input("Déchiffrage du chiffre de César : entrez votre crypto EN MAJUSCULES et SANS ESPACES(limité à 1000 caractères) : ")
for n in range(1, 26):
clair = ''
for c in cryptogramme:
clair += chr((ord(c)-ord('A')+ n)%26 +ord('A'))
print(n,' ',clair)
Je ne sais pas si on peut faire plus court !
- Ernst
- 07-02-2024 14:47:26
Hello DrStone,
Même si chacun ajoute son ressenti on est tous d’accord sur l’essentiel je pense.
Je voulais simplement indiquer que la méthode employée est quand même bien compliquée et peu adaptée pour pas grand-chose…
Yeap, pour moi la programmation amateur c’est un peu comme faire du Lego Technic, un plaisir tout à fait personnel pour des résultats souvent dérisoires – sans compter la brique oubliée quand on est pieds nus...
Dès lors, il me parait plus qu'acceptable d'utiliser une double attaque par fréquences et dictionnaire. M'enfin.
Tu peux me rétorquer que le groupe utilisant le chiffrement par décalage pouvait avoir inventé ses propres mots/abréviations.
Pour moi le défi – si défi il y a – ce n'est pas d'inventer son propre code, c'est d'utiliser celui-là et pas un autre. J’ai essayé de te bricoler un truc un peu retors en écrivant « J’ai adoré "Chaos et Fractals, New Frontiers of Science" de Peitgen, Jürgens et Saupe chez Springer-Verlag. » histoire d’avoir des trucs bizarres comme de l’anglais et des noms propres, le tout en capitales sans espace, accent et ponctuation : JAIADORECHAOSETFRACTALSNEWFRONTIERSOFSCIENCEDEPEITGENJURGENSETSAUPECHEZSPRINGERVERLAG.
J’ai ensuite retourné la chaine de caractères pour déjouer une reconnaissance visuelle globale, ce qui donnait GALREVREGNIRPSZEHCEPUASTESNEGRUJNEGTIEPEDECNEICSFOSREITNORFWENSLATCARFTESOAHCERODAIAJ
et avec un décalage finement choisi on tombait sur PJUANEANPWRAYBINQLNYDJBCNBWNPADSWNPCRNYNMNLWNRLBOXBANRCWXAOFNWBUJCLJAOCNBXJQLNAXMJRJS
Tadaa ! Sauf qu’effectivement tu as raison, avec les fréquences il suffit de remarquer les quinze occurrences du N pour en faire un E, et là pof, on tombe sur le message inversé, c’est plié.
(finalement le seul truc à faire avec le code de César, c’est de n’y mettre que des lettres au hasard pour égarer les équipes du contre-espionnage)
- Ernst
- 07-02-2024 14:26:20
Et oui c'est amusant des faire tourner des trucs obsolètes pour le fun !
Et c'est très sympa d'avoir des retours par des personnes que le sujet interpelle :)
J’ai toujours aimé lire les passionnés capables de dépasser une limite à force d’astuce et d’obstination. Des fois je ne comprends la moitié du truc mais cela ne m’empêche pas d’apprécier, par exemple ici le recours à la liste des occurrences de quatre caractères, wouaou, on sent le truc bien construit quand même.
- gielev
- 06-02-2024 21:28:57
Rebonjour gielev.
Et oui c'est amusant des faire tourner des trucs obsolètes pour le fun !
Bien sûr ! Il y a même pas un ou deux ans, j'ai codé une version d'ENIGMA en assembleur (chiffrement et déchiffrement). C'était inutile, long et compliqué ; mais qu'est-ce que c'était fun ! Si c'était à refaire, je le referais sans hésiter. Néanmoins, je ne suis pas pour autant parti sur une méthode qui me complique la vie pour peu de bénéfice comme cela semble être le cas dans ton POC. Et que ça soit ou non du Fortran n'y change rien. ;)
Là je dis Chapeau !
Et si tu aimes bidouiller de l'Enigma voici un challenge qui pourrait t'intéresser.
Les 9 premiers messages sont plutôt faciles. Le dernier c'est du costaud !
https://www.ciphermachinesandcryptology … llenge.htm
- DrStone
- 06-02-2024 17:38:46
Bonjour Ernst
Si je peux me permettre, je ne crois pas qu’il faille voir ici autre chose qu’un exercice de style.
Bien entendu, je l'avais très bien compris. :=)
Je voulais simplement indiquer que la méthode employée est quand même bien compliquée et peu adaptée pour pas grand-chose… même si elle reste bien entendu amusante et formatrice (j'ai commis bien pire pour m'amuser, y compris en Fortran dans les années 80).
Pour ce qui est de dictionnaire ou de fréquence, c’est partir sur des présupposés, comme celui de penser que le message a été rédigé en français littéraire. Une suite de coordonnées par exemple risque fort de mettre ce genre d’approche en échec, un message dans une autre langue peut-être aussi. Donc si j’avais à le faire, je garderai la proposition d’afficher en clair les 26 versions en espérant tomber sur des mots ou des séquences que je reconnaîtrai visuellement.
D'un autre côté, c'est assez rare d'utiliser le chiffrement par décalage pour autre chose que du texte pur (même si aujourd'hui on pourrait l'utiliser sur tout l'utf-8 auquel cas ça ne servirait à rien d'afficher toutes les possibilités en clair - en effet, avec plusieurs dizaines à centaines de milliers de possibilités, ça fait beaucoup de messages à afficher) pour deux raisons :
La première c'est que ce n'est plus utilisé aujourd'hui ; on préfèrerait largement utiliser RSA et consorts.
La seconde c'est que c'est une méthode qui était donc, de fait, utilisée par les anciens. Or, je n'ai pas souvenir d'avoir lu des positions GPS chez les empereurs romains, par exemple.
Dès lors, il me parait plus qu'acceptable d'utiliser une double attaque par fréquences et dictionnaire. M'enfin.
Tu peux me rétorquer que le groupe utilisant le chiffrement par décalage pouvait avoir inventé ses propres mots/abréviations. Je te dirais que oui, et dans ce cas, tu utilises un dictionnaire de ce langage inventé. Encore faut-il le connaitre… mais si tu ne le connais pas, tu ne pourras de toute façon rien faire même en ayant toutes les possibilités affichées.
Rebonjour gielev.
Et oui c'est amusant des faire tourner des trucs obsolètes pour le fun !
Bien sûr ! Il y a même pas un ou deux ans, j'ai codé une version d'ENIGMA en assembleur (chiffrement et déchiffrement). C'était inutile, long et compliqué ; mais qu'est-ce que c'était fun ! Si c'était à refaire, je le referais sans hésiter. Néanmoins, je ne suis pas pour autant parti sur une méthode qui me complique la vie pour peu de bénéfice comme cela semble être le cas dans ton POC. Et que ça soit ou non du Fortran n'y change rien. ;)
- gielev
- 06-02-2024 15:51:59
bonjour,
Un sujet du Monde d'aujourd'hui (rajouter http://www. devant les liens et .html derrière)
http://www.lemonde.fr/sciences/article/ … 50684.html
Quelques infos générales sur la "bête"
http://www.idris.fr/eng/jean-zay/jean-z … n-eng.html
Et là des infos techniques
http://www.idris.fr/eng/jean-zay/cpu/je … w-eng.html
Tout en bas de la page on lit :
Basic Software description
Compilers
PGI compilers pgfortran and pgcc
Et pour répondre aux 2 messages précédents, encore une fois, comme l'a compris Ernst il s'agit d'un exercice de style. d'une proof of concept comme disent les anglo-saxons.
Fortran n'est de toute façon pas dédié aux manipulations de chaines de caractères.
Si on peut trouver une fonction shuffle dans ses bibliothèques, elle n'est implémentée que pour des nombres, tableaux de nombres etc... mais pas des lettres.(il faudrait passer par des nombres, leur rang dans l'alphabet pour les manipuler)
Et oui c'est amusant des faire tourner des trucs obsolètes pour le fun !
Et c'est très sympa d'avoir des retours par des personnes que le sujet interpelle :)
A cette époque désormais lointaine, on ne communiquait pas par Internet comme ici , mais directement par courrier avec les rédacteurs de journaux traitant d'informatique et avec d'autres lecteurs... et on utilisait beaucoup de bouquins, mais on bidouillait dur.
J'avais ainsi appris à formater une 41ème piste sur une disquette 5"1/4, à y inscrire quelque chose que je pouvais appeler par mes programmes... excellent moyen à (l'époque) de protection contre la copie.
- Ernst
- 06-02-2024 14:50:43
Bonjour,
Si je peux me permettre, je ne crois pas qu’il faille voir ici autre chose qu’un exercice de style. Perso je n’ai pas connu le Fortran, mais d’après mes lectures il a été une avancée considérable en matière de calculs scientifiques à l’époque du développement informatique, et c’est un vrai plaisir de voir que pour certains usages il est encore indispensable, et de constater qu’avec les connaissances qui vont bien on peut toujours en tirer quelque chose.
Pour ce qui est de dictionnaire ou de fréquence, c’est partir sur des présupposés, comme celui de penser que le message a été rédigé en français littéraire. Une suite de coordonnées par exemple risque fort de mettre ce genre d’approche en échec, un message dans une autre langue peut-être aussi. Donc si j’avais à le faire, je garderai la proposition d’afficher en clair les 26 versions en espérant tomber sur des mots ou des séquences que je reconnaîtrai visuellement.
N’empêche, j’aime bien ce genre de sujet, qui réveille des souvenirs chez tous ceux qui ont bricolé avec des outils maintenant obsolètes.
Bonne journée.
- DrStone
- 06-02-2024 13:14:03
Bonjour gielev.
D'ailleurs cette méthode est parfois utile pour le chiffre de Vigenère quand on recherche les décalages de chaque alphabet utilisé dans la clé.
En effet, il s'agit d'une des méthodes employées, généralement aussi simple qu'efficace.
Mais attention avec le fameux texte de Perec ne contenant aucun "e" ça peut s'avérer plus délicat.
On peut éviter ça en utilisant, par exemple, un dictionnaire des, disons, 100 mots les plus utilisés, et tester si on en trouve au moins $n$ (à fixer) dans notre texte déchiffré (si c'est le cas, on arrête la recherche dans le dictionnaire pour ne pas perdre de temps ni de ressources inutilement). Si non, on utilise le décalage par rapport à la lettre suivante $(e \rightarrow a \rightarrow i \rightarrow s\dots)$.
Moi j'ai juste fait de la force brute avec un calcul de score pour faire le tri dans les solutions possibles.
Ça reste une solution viable mais gourmande en ressource. À ce niveau-là, il vaut peut-être mieux tester les 25 possibilités. En revanche, je reconnais que c'est très formateur comme façon de faire !
Je rappelle qu'ici l'idée était simplement de le faire avec un langage de programmation "ancien" et parfois dénigré alors qu'encore très utilisé dans certains domaines d'applications très précis (par exemple les programmes de tests des supercalculateurs)
Personne ne dénigre Fortran ici. :=)
J'aurais juste tendance à dire qu'un bon ingénieur (informaticien) utilise le bon langage de programmation pour la bonne tâche ; et pour le coup, j’émets des réserves quant-au fait que Fortran soit le bon langage de programmation pour déchiffrer un message chiffré.
Mais à nouveau, peut importe le langage, s'il est Turing-Complete, il peut résoudre n'importe quel problème. Fais-toi donc plaisir ! Je regarde même de temps en temps une personne sur YouTube qui s'amuse à faire des trucs dans des langages de programmation généralement peu adaptés. Récemment, il a de créer un “jeu” (note les guillemets) web en langage “C” (note les guillemets une fois encore - c'est plus compliqué que ça : il a aussi besoin de JavaScript par exemple).
PS: Ton téléphone portable ou ton ordinateur sont déjà, à eux seuls, des supercalculateurs. La puissance de calcul disponible dans, mettons, les derniers iPhone est supérieur à ce qui se faisait dans les supercalculateurs des années 90.
- gielev
- 06-02-2024 11:14:46
@DrStone
Bien évidemment qu'on peut essayer comme ça. D'ailleurs cette méthode est parfois utile pour le chiffre de Vigenère quand on recherche les décalages de chaque alphabet utilisé dans la clé.
Mais attention avec le fameux texte de Perec ne contenant aucun "e" ça peut s'avérer plus délicat.
Moi j'ai juste fait de la force brute avec un calcul de score pour faire le tri dans les solutions possibles.
Je rappelle qu'ici l'idée était simplement de le faire avec un langage de programmation "ancien" et parfois dénigré alors qu'encore très utilisé dans certains domaines d'applications très précis (par exemple les programmes de tests des supercalculateurs)
- DrStone
- 05-02-2024 18:45:25
Bonsoir.
Question un peu idiote, mais… ne serait-ce pas plus simple de prendre un texte en français (ou anglais, ou… selon la langue) ; de compter le nombre d’occurrences des lettres afin d'obtenir leurs fréquences d'apparition (si on veut vraiment tout faire soi-même sinon on peut utiliser ce qui a déjà été fait : https://fr.wikipedia.org/wiki/Fr%C3%A9q … es_lettres) ; et à partir de ce moment-là, trouver les lettres les plus fréquentes dans ton message chiffré afin d'obtenir le décalage ?
Dans ton exemple
on compte les d’occurrences comme suit
('z', 37), ('e', 33), ('k', 33), ('i', 32), ('f', 26),
('d', 21), ('u', 18), ('t', 18), ('g', 12), ('x', 12),
('y', 11), ('m', 10), ('s', 9), ('h', 7), ('o', 4),
('w', 3), ('p', 2), ('q', 1)
avec V la lettre la plus utilisée.
Or, on sait qu'en français, la lettre la plus utilisée est E : le décalage est donc, sans même aller plus loin, de 17 (ou $-9 \mod 26$). Il ne reste alors plus qu'à appliquer la fonction de chiffrement avec le décalage $-9$.
- Wiwaxia
- 03-02-2024 00:46:06
Bonsoir,
Ayant rarement manipulé les chaînes de caractères, je me suis pris de curiosité pour le message caché, ce qui m'a conduit à rédiger un programme rudimentaire en Pascal.
Ce qui n'est pas très difficile, puisqu'il suffit, dans le cas du code utilisé, de trouver le bon décalage (Delta) sur le début du texte pour faire apparaître tout l'ensemble - soit au maximum 25 essais.
- gielev
- 02-02-2024 19:17:26
bonjour,
Je mets ce sujet ici car c'est plutôt de la programmation que de la cryptographie...
Et c'est un peu pour le fun que je publie ceci !
il y a de cela quelques semaines, il a été question d'une panne de la sonde Voyager 1.Dans un article qui en parlait on disait que la NASA recherchait des ingénieurs capables de programmer un correctif pour tenter de la réparer, ce qui a été fait et avec succès.
Le problème était que les programmes de fonctionnement de la sonde nécessiataient d'être écrits en Fortran, et forcément dans une ancienne version du langage datant d'il y a au moins 46 ans...
Il y a 46 ans j'étais étudiant et je commettais mes tout premiers programmes informatiques et ils étaient écrits en Fortran IV aka Fortran 66.
Certaines structures de langage ne sont apparues que par la suite dans Fortran 77 telles IF ... THEN.
A l'époque on écrivait IF (Condition) x,y,z où x,y et z étaient des labels numériques qui renvoyaient vers des blocs de programmes.
Un collègue facétieux me proposait même de bricoler un lecteur de cartes perforées avec un Arduino ! :)))))
Je n'ai pas conservé les cartes perforées ! :))).
Je me suis dit alors qu'on doit pouvoir écrire des programmes de déchiffrage de cryptos...
Il est vrai qu'à la base Fortran n'est pas dédié à la manipulation de texte.
J'ai donc décidé de faire simple avec un César, histoire de faire une "proof of concept".
Certains outils de Python n'existant pas en Fortran ça demande un peu de temps pour les adapter.
J'ai repris les idées de Rossignol sur sa page dédiée à cela, avec les calculs de score.
J'ai cependant modifié le fichier des tétragrammes que j'avais pour faire de la brute-force, en ne gardant que la colonne des tétragrammes à laquelle j'ai adjointe une colonne avec le log(fréquences)
J'ai aussi raccourci le fichier des tétragrammes en enlevant les peu fréquents pour que la recherche des tétragrammes et le calcul du logscore soit plus rapide.
J'utilise gfortran avec Geany sous Linux, on peut donc lancer le programme en ligne de commande dans un terminal par ./nom de fichier (sans extension).
C'est plutôt performant !
Contrairement à ce qu'on pense Fortran est encore utilisé (Nombreuses sources sur la Toile).
A tester avec peut-être ceci :
JFLMVEKGFLIJRDLJVICVJYFDDVJUVHLZGRXVGIVEEVEKUVJRCSRKIFJMRJKVJFZJVRLOUVJDVIJHLZJLZMVEKZEUFCVEKJTFDGRXEFEJUVMFPRXVCVERMZIVXCZJJREKJLICVJXFLWWIVJRDVIJRGVZEVCVJFEKZCJUVGFJVJJLICVJGCRETYVJHLVTVJIFZJUVCRQLIDRCRUIFZKJVKYFEKVLOCRZJJVEKGZKVLJVDVEKCVLIJXIREUVJRZCVJSCRETYVJTFDDVUVJRMZIFEJKIRZEVIRTFKVUVLOTVMFPRXVLIRZCVTFDDVZCVJKXRLTYVVKMVLCVCLZERXLVIVJZSVRLHLZCVJKTFDZHLVVKCRZUCLERXRTVJFESVTRMVTLESILCVXLVLCVCRLKIVDZDVVESFZKREKCZEWZIDVHLZMFCRZKCVGFVKVVJKJVDSCRSCVRLGIZETVUVJELVVJHLZYREKVCRKVDGVKVVKJVIZKUVCRITYVIVOZCVJLICVJFCRLDZCZVLUVJYLVVJJVJRZCVJUVXVREKCVDGVTYVEKUVDRITYVITYRICVJSRLUVCRZIV
Le code suit . Il peut paraître rudimentaire, 51 lignes m'ont suffi, mais je suis resté volontairement proche de Fortran IV n'étant pas resté à jour sur l'évolution du langage ! Je suis passé par la suite à des choses plus "conviviales" :)
PROGRAM Cesar
IMPLICIT NONE
character(len=4) :: tetra_lu,tetra
integer n_ligne,comp,l,m,n
real k,logscore,meilleurscore
character(:),allocatable :: chaine,clair
character(len=1000) :: crypto
l=0
logscore=0
meilleurscore=1e10
write(*,*)'Programme de déchiffrage du chiffre de César'
write(*,*)''
write(*,*)'Entrez votre crypto EN MAJUSCULES et SANS ESPACES(limité à 1000 caractères)'
read(*,*)crypto
chaine=trim(crypto)
clair=''
! exemple de chaine pour test
! chaine = 'JLJPLZABULZZHPKLWYVNYHTTLKLKLJOPMMYHNLKBJOPMMYLKLJLZHY'
write(*,*)''
do m=1,26
logscore=0
do n=1,len(chaine)
if(ichar(chaine(n:n))>=90) then
chaine(n:n) = achar(64)
endif
chaine(n:n)=achar(ichar(chaine(n:n))+1)
end do
!write(*,*)m,' ',chaine
l=0
!do comp=1,len(chaine)-3 ! recherche des tétragrammes
do comp=1,4 ! variante rapide
Tetra=chaine(comp:comp+4)
open(unit=20, file='FreqTetrag3.txt',form='formatted')
n_ligne = 0
do while (.true.)
read(unit=20,fmt=*,iostat=n_ligne) tetra_lu,k
if (n_ligne .ne. 0) exit
if (tetra_lu .EQ. Tetra) l = l+1
if (tetra_lu .EQ. Tetra) logscore = logscore + k
if (tetra_lu .EQ. Tetra) exit
enddo
close(20)
enddo
logscore=logscore + (len(chaine)-3-l)*100
if (logscore < meilleurscore) clair = chaine
if (logscore < meilleurscore) meilleurscore = logscore
if (tetra_lu .EQ. Tetra) write(*,*)'décalage =',26-m,' ',chaine
enddo
write(*,*)''
write(*,*) 'Possible clair : ', clair
end program Cesar
Le fichier des téragrammes peut être trouvé ici : (merci à Rossignol)
https://bribes.org/crypto/brut4g_fr.txt
Personnellement j'ai éliminé tous ceux qui ont une occurence inférieure à 200.
Et j'ai remplacé la colonne des occurences par une colonne de fréquences.
J'ai ensuite renommé le fichier en FreqTetrag3.txt. J'ai utilisé des versions différentes lors de mes essais d'où le 3.