Nombre binaire toujours sur un octet:

Résolu/Fermé
Ben - Modifié le 22 mars 2022 à 23:33
 Ben - 23 mars 2022 à 13:41
Bonjour,
Je dois réaliser un programme cryptage qui crypte un message à l'aide d'une clée.
Pour cela je converti le tout en binaire chaque lettre est associée a son nombre en binaire ( ASCII) . J'ai donc deux liste de même taille, avec des nombres binaires sur un octet.
Le soucis c'est que quand je fais XOR entre deux lettre qui possède une ecriture binaire identique sur les 4 premiers bits (ex : 1010 0101 et 1010 1011 ) python va me renvoyer 1110 et c'est normal. Sauf que moi je veux que tout soit écrit sur un octet.
Voila la ligne de code qui fait le XOR.
for i in range(len(message_bin)):
        message_cryptee.append(bin(int(message_bin[i])^int(cle_bin[i]))[2:])

Et voila mon code en entier ( il est pas fini car je bloque la dessus justement, je vous laissez quelques print qui peuvent aider la lecture):
##Section Sécurisation des communications:

def chiffrement(message, cle): #prend en argument un message (ASCII) et une clé de chiffrement, la fonction renvoie une chaine de caractère soit le messages crypté
    message_tab = [ lettre for lettre in message]
    message_bin = []
    cle_bin = []
    message_cryptee = []
    for i in range(len(message)):
        x = message[i]
        if i > len(cle)-1:
            i = i - len(cle)-1
            z = cle[i]
        else:
            z = cle[i]
        cle_bin.append(''.join(format(ord(z), 'b')))
        message_bin.append( ''.join(format(ord(x),' b')))                
        
    print("liste binaire mess",message_bin)
    print(len(message_bin))
    print("liste binaire cle",cle_bin) 
    print(len(cle_bin))
    for i in range(len(message_bin)):
        message_cryptee.append(bin(int(message_bin[i])^int(cle_bin[i]))[2:])
    print(message_cryptee)
    return " ".join(message_cryptee) 


Si quelqu'un a un astuce ou une idée je suis prenuer :)
Merci d'avance
Ben



Configuration: Windows / Firefox 98.0

1 réponse

jee pee Messages postés 40559 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 décembre 2024 9 459
Modifié le 23 mars 2022 à 01:08
Bonjour,

On peut utiliser un format d'affichage
08b
, longueur fixe 8, en conservant les zéro de tête. Pour ta cle plus courte que le message, tu peux utiliser modulo pour récupérer une position dans clé.

##Section Sécurisation des communications:

def chiffrement(message, cle): #prend en argument un message (ASCII) et une clé de chiffrement, la fonction renvoie une chaine de caractère soit le messages crypté
    message_bin = []
    cle_bin = []
    message_crypte = []
    for i in range(len(message)):
        x = message[i]
        z = cle[i%len(cle)]
        print(x,z)
        cle_bin.append(''.join(format(ord(z),'08b')))
        message_bin.append(''.join(format(ord(x),'08b')))                
        
    print("liste binaire mess",message_bin)
    print(len(message_bin))
    print("liste binaire cle ",cle_bin) 
    print(len(cle_bin))
    for i in range(len(message_bin)):
        message_crypte.append('{:08b}'.format(int(message_bin[i],2)^int(cle_bin[i],2)))
    print(message_crypte)
    return " ".join(message_crypte) 

print(chiffrement('bonjour','B'))
print(chiffrement('bonjour','bonjour')) 


et une fois que cela fonctionne, et est compris, on peut supprimer x et y et mettre la valeur directement dans ord()

0
Bonjour, merci de ta réponse, je voulais pas m'arrête avant d'avoir trouver hier soir. Et j'ai trouvé je fais juste un x.zfill(8)
Et ça me rajoute des 0 autant qu'il faut pour que len(x) soit égale à 8.
Bonne journée
0