Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/02/2009, à 12:58

\\Ouranos//

Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

Bonjour,

Ce cryptage "par alphabet inversé" est un moyen de chiffrer des textes : A est remplacé par Z, B par Y, etc...

Je voulais faire un petit script qui récupère une lettre dans un fichier, et dont voici l'algorigramme :

- On définit les variables :
  -numérique : character_number , number_of_lines , current_line
  -alphabétique : filename , output_filename , letter , letter_
- On demande à l'utilisateur de rentrer un nom de fichier entrant et un nom de fichier sortant, et on les place dans filename et output_filename
- On crée le fichier de sortie
- On catte le fichier d'entrée, puis on le cutte grâce à character_number et current_line
- Si il n'y a pas d'erreur :
  - On insère le résultat dans letter
- Si letter vaut A , letter_ est défini à Z, etc...
- Si c'est la fin de la ligne, on remet character_number à 1 et on incrémente current_line
- Sinon, on incrémente character_number

Mes questions :
- Quel langage utiliser ?
- Comment trouver que c'est bien la fin de la ligne ?
- Comment utiliser une commande cut qui permette de trouver la lettre kivabien en utilisant current_line et character_number ?

Merci d'avance pour vos réponses.


Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.

Hors ligne

#2 Le 04/02/2009, à 13:26

Grunt

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

1) Pourquoi t'embêter avec les retours à la ligne, le nombre de lignes, les espaces?
Tu prends le fichier caractère par caractère, ce qui est une lettre tu le remplaces, et tu touches pas au reste: c'est pas plus simple?

2) Tu peux le faire en python tongue

#3 Le 04/02/2009, à 13:41

tshirtman

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

ton "algorithme" ne ressemble pas a une réponse au problème que tu pose en premier. Et si s'en est une, elle est très mauvaise.

en python je te fait ça en une ligne avec map et un lambda.

edit: et s'il te plait n'appelle pas ça un cryptage ^^'.

Dernière modification par tshirtman (Le 04/02/2009, à 13:42)

Hors ligne

#4 Le 04/02/2009, à 14:02

Toineo

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

tshirtman a écrit :

ton "algorithme" ne ressemble pas a une réponse que au problème que tu pose en premier. Et si s'en est une, elle est très mauvaise.

en python je te fait ça en une ligne avec map et un lambda.

edit: et s'il te plait n'appelle pas ça un cryptage ^^'.

Voila, il fait ca en une ligne tongue

Et pis oui, on dit pas cryptage, on dit chiffrement en bon francais. Et c'est sûr que c'est pas vraiment du chiffrement ^^


Fail

Hors ligne

#5 Le 04/02/2009, à 15:40

Totor

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

Il est aussi possible de le faire en bash en une ligne... certe pas très "lisible" mais c'est réalisable :

echo "$(sed 's/\(.\)/\1\n/g' <<< AZAZ|xargs -l -I {} printf "90-(%d-65)\n" \'{}|bc|xargs -l printf "%x\n"|xargs -l -I {} printf "\x{}")"

ici AZAZ donne ZAZA...

si tu veux étendre à tous les caractères ASCII, changes 90-(%d-65) par 255-%d


-- Lucid Lynx --

Hors ligne

#6 Le 04/02/2009, à 15:45

®om

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

echo ABYZ | tr -s A-Z ZYXWVUTSRQPONMLKJIHGFEDCBA

devrait donner :

ZYBA

(non testé)

Hors ligne

#7 Le 04/02/2009, à 15:46

Totor

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

certe, en listant l'alphabet...

mais 'faut supprimer le -s

Dernière modification par Totor (Le 04/02/2009, à 15:48)


-- Lucid Lynx --

Hors ligne

#8 Le 04/02/2009, à 15:55

tshirtman

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

@®om: en effet le -s est en trop, ensuite si je puis me permettre, ton exemple peut laisser supposer que ta commande fait tout autre chose, mauvais choix tongue

ensuite je vous rassure c'est pas franchement plus lisible en python ^^.

from string import lowercase, uppercase
print "".join(map(lambda(x): x in lowercase and lowercase[-lowercase.index(x)-1] or  x in uppercase and uppercase[-uppercase.index(x)-1] or x,raw_input()[:]))

là ça lit l'entrée standard, mais on peut lui passer une variable à la place de raw_input() ^^.

(ouais c'est "presque" une ligne, un import ça compte pas vraiment... wink)

edit: et je peux virer les imports et copier les tableaux de lettres betements... c'est juste 10× plus long comme ligne du coup

Hors ligne

#9 Le 04/02/2009, à 20:34

aleph2

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

>>> # une table de 256 caractères
>>> table = ' ' * 65 + 'ZYXWVUTSRQPONMLKJIHGFEDCBA' + ' ' * 165
>>> 'ABC rien XYZ'.translate(table)
ZYX      CBA
>>>

#10 Le 04/02/2009, à 22:47

tshirtman

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

Ah, c'est marrant translate ^^.

...comme quoi on apprends tous les jours, et pourtant je fait du python tous les jours...

edit: cela dit moi ça translate uppercase, lowercase et conserve tout le reste intact, mais ta solution peut faire ça aussi ^^ avec un poil d'adaptation smile.

Dernière modification par tshirtman (Le 04/02/2009, à 22:50)

Hors ligne

#11 Le 05/02/2009, à 10:27

aleph2

Re : Cryptage/Décryptage "par alphabet inversé" en Ruby ou Bash

> tshirtman

Ce n'est qu'un travail de création de la table qui ne se fait qu'une fois.

>>> for i in range(256):
        all += chr(i)
        
>>> table = all[:65] + all[65:91][::-1] + all[91:97] + all[97:123][::-1] + all[123:256]
>>> '012 AZaz +*-='.translate(table)
012 ZAza +*-=
>>>

----

Si tu veux créer ta fonction de conversion, il est préférable de travailler avec les
codes des caractères et non avec les caractères. Un examen attentif d'une table de
caractères devrait te mettre sur la piste.

>>> ord('a') - ord('A')
32
>>> ord('b') - ord('B')
32
>>> ord('é') - ord('É')
32
>>> ord('æ') - ord('Æ')
32

Avec toutefois quelques cas tordus...

>>> ord('œ') - ord('Œ') # cp1252
16
>>> ord('š') - ord('Š')
16