Décodage fonction affine

Fermé
ber3n1c3 - Modifié par ber3n1c3 le 11/05/2016 à 20:15
 ber3n1c3 - 11 mai 2016 à 23:21
Bonjour,

j'ai un projet isn consistant en créer deux programmes afin de codage et décodage avec une fonction affine. Le codage est okay, cependant le décodage est impossible: j'ai un programme, mais il ne fonctionne pas. Si quelqu'un pouvait jeter un coup d'oeil au programme et voir si il y voit une erreur, ce serait super.

merci d'avance


def Modulo(a):
for c in range(0,25):
R=a*c
if R==1%26:
return c


def FonctionAffineDécodage (a,b,m):
n=''
c=Modulo(a)
for i in range (0,len(m)):
if ord(m[i])!=32:
N=ord(m[i])-65
x=c*(N-b)
L=x+65
n=n+chr(L)
else:
n=n+m[i]

return n



a=int(input('variable a ='))
b=int(input('variable b ='))
m=str(input('le message à décoder est ='))
print('le message décodé est ',FonctionAffineDécodage(a,b,m))






A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
11 mai 2016 à 20:08
Bonjour,

Pour comprendre ce qui ne va pas avec ton décodage il faudrait aussi voir comment tu as fait ton encodage.

PS. Attention au vocabulaire, le cryptage c'est autre chose.
0
def FonctionAffineCodage (a,b,m):
n='' #il faut initialisé la variable n
for i in range (0,len(m)):
if ord(m[i])!=32:
N=ord(m[i])-65
J=(a*N)+b
K=(J%26)
L=K+65
n=n+chr(L)
else:
n=n+m[i]


return n


a=int(input('variable a ='))
b=int(input('variable b ='))
m=str(input('le message à coder est ='))
print('le message codé est ',FonctionAffineCodage(a,b,m))


voila mon programme de codage ;) merci
d'accord j'y ferai plus attention
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
11 mai 2016 à 22:58
Donc en gros, ce que tu fais c'est convertir tes caractères (A=65, B=66...) en chiffres puis tu appliques le (dé)codage avant de revenir aux caractères.

Codage → c(x,a,b) ≡ a.x+b [26]
Décodage → d(y,a,b) ≡ (y-b).a⁻¹ [26]

Alors je ne connais pas Python, mais je pense que R==1%26 est incorrect.
Il faudrait plutôt écrire R%26==1

Remarque : si b peut-être quelconque (entre 1 et 26) par contre il faut choisir a correctement, car pour que ça fonctionne on doit avoir pgcd(a, 26) = 1
C'est à dire a ∈ { 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25 }
Ce qui donne les couples (a, a⁻¹) = { (1,1), (3, 9), (5, 21), (7, 15), (11, 19), (25, 25) }

Remarque : perso j'étendrais le cas de l'espace if ord(m[i]) != 32 à tout les autres caractères que A-Z puisque ce sont les seuls qui peuvent être (dé)codés.
0
ber3n1c3 > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
11 mai 2016 à 23:21
je vois, mais il persiste à ne pas vouloir multiplier par c, et à afficher cela
Traceback (most recent call last):
File "E:\Projet\FonctionAffineDécodage.py", line 27, in <module>
print('le message décodé est ',FonctionAffineDécodage(a,b,m))
File "E:\Projet\FonctionAffineDécodage.py", line 14, in FonctionAffineDécodage
x=c*(N-b)
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'


et même lorsque je change de variable, que je mets int, il ne l'enlève pas et je ne vois vraiment pas pourquoi.

c'est une très bonne idée d'appliquer à tous les caractères, je vais peut être vous la piquez ;)
merci beaucoup pour ce que vous avez déjà fait et que vous avez pris sur votre temps pour répondre
0