IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Python Base64 vers int


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Par défaut Python Base64 vers int
    Bonjour à tous,

    Je me permets de poster ici après de multiples tests infructueux.

    En effet, j'ai généré une clef RSA via openssl ($openssl genrsa macle.pem 512) de 512 bits dans le format base64. Je voulais récupérer l'int associé à cette clef via python en utilisant la bibliothèque base64 et plus précisément base64decode avec la commande int.from_bytes(b64decodes(la_str_clef),'big') puis je la récup en hexa puis en int base 10 mais le résultat n'est jamais le bon j'ai l'impression ...

    Auriez-vous des pistes pour régler ce soucis ?
    P.S. je fais cette manip pour ensuite faire le pgcd des clés et regarder si elles partagent des facteurs communs.

    Merci par avance pour vos retours.

    Chaka

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Je réfléchis à ton truc car il parait logique... mais je sens qu'il y a un cafouillage. Et je crois que le cafouillage se situe au niveau de base64 car cet outil n'est pas dédié à convertir une clef RSA en int. C'est un outil dédié à convertir un binaire en ascii

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> x=base64.b64encode(b"123")
    >>> x
    b'MTIz'
    >>> y=base64.b64decode(x)
    >>> y
    b'123'
    >>> int.from_bytes(y, 'big')
    3224115
    >>> int.from_bytes(y, 'little')
    3355185
    De là, si tu utilises un outil non adapté, l'int que tu obtiens ne peut pas être correct...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Je réfléchis à ton truc car il parait logique... mais je sens qu'il y a un cafouillage. Et je crois que le cafouillage se situe au niveau de base64 car cet outil n'est pas dédié à convertir une clef RSA en int. C'est un outil dédié à convertir un binaire en ascii

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> x=base64.b64encode(b"123")
    >>> x
    b'MTIz'
    >>> y=base64.b64decode(x)
    >>> y
    b'123'
    >>> int.from_bytes(y, 'big')
    3224115
    >>> int.from_bytes(y, 'little')
    3355185
    De là, si tu utilises un outil non adapté, l'int que tu obtiens ne peut pas être correct...
    Merci beaucoup pour ton message !

    Effectivement, ton explication parait logique ! N'ayant pas trouvé d'autre bibliothèque qui faisait ça, j'ai pris la seule dont j'avais connaissance qui pouvait traiter mon problème.

    Aurais-tu une solution/recommandation/conseil afin que j'obtienne le bon résultat ?

    Merci par avance

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Chaka_Sobek Voir le message
    Aurais-tu une solution/recommandation/conseil afin que j'obtienne le bon résultat ?
    Ben en fait je n'ai pas compris quel résultat tu cherches. Tu veux l'int correspondant à la clef c'est ça?
    Mais la clef ce n'est pas un int !!! C'est une combinaison de plein d'int !!!

    Principe de base de RSA
    • choisir P et Q premiers (exemple 89 et 97)
    • calculer delta=(P-1) * (Q-1) => 8448
    • calculer N=P*Q => 8633
    • choisir e tel e premier avec delta => pgcd(e, delta)=1. Exemple e=7, pgcd(7, 8448) est bien égal à 1 => la clef publique sera le coupe (N, e) soit ici (8633, 7)
    • choisir une valeur "d" telle que (d * e) modulo delta = 1. Exemple d=1207 => 1207 * 7 = 8449 et 8449 modulo 8448 est bien égal à 1. La clef privée sera le couple (N, d) soit ici (8633, 1207)


    A partir de là, pour chiffrer une valeur (exemple) 555 sur la clef publique (N, e) on calcule (555^e) modulo N soit (555^7) % 8633 = 2928
    Et pour déchiffrer 2928 avec la clef privée (N, d) on calcule (2928^d) modulo N soit (2928^1207) % 8633 = 555

    Et pour signer c'est dans l'autre sens. Exemple on veut signer 667 via la clef privée (N, d) on calcule (667^d) modulo N soit (667^1207) % 8633 = 8625
    Et on vérifie la signature avec la clef publique (N, e) via (8625^e) modulo N soit (8625^7)%8633 ce qui redonne 667.

    Ci-joint un petit essai quand j'ai tenté du chiffrement en Python: Alice envoie un message vers Bob en utilisant la clef publique de Bob, et signe ce message en utilisant sa clef privée.
    Et Bob déchiffre le message avec sa clef privée et vérifie qu'il vient bien de Alice en checkant sa signature via la clef publique de Alice.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/env python3
    # coding: utf-8
     
    from Cryptodome.PublicKey import RSA
    from Cryptodome.PublicKey import RSA
    from Cryptodome.Cipher import PKCS1_OAEP
    from Cryptodome.Signature import PKCS1_PSS
    from Cryptodome.Hash import SHA
     
    message="Hello Woréld !!!"
    print(message, type(message))
     
    alice=RSA.generate(2048)
    bob=RSA.generate(2048)
    print(alice.publickey().exportKey())
    print(bob.publickey().exportKey())
     
    secret={
    	"chiffre" : PKCS1_OAEP.new(bob.publickey()).encrypt(message.encode("utf-8")),
    	"sign" : PKCS1_PSS.new(alice).sign(SHA.new(message.encode("utf-8"))),
    }
     
    final=PKCS1_OAEP.new(bob).decrypt(secret["chiffre"]).decode("utf-8")
    print("ok déchiffrement" if message == final else "erreur chiffrement")
     
    verify=PKCS1_PSS.new(alice.publickey()).verify(SHA.new(final.encode("utf-8")), secret["sign"])
    print("%s signature (%s)" % ("ok" if verify else "erreur", verify))
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben en fait je n'ai pas compris quel résultat tu cherches. Tu veux l'int correspondant à la clef c'est ça?
    Mais la clef ce n'est pas un int !!! C'est une combinaison de plein d'int !!!

    Principe de base de RSA
    • choisir P et Q premiers (exemple 89 et 97)
    • calculer delta=(P-1) * (Q-1) => 8448
    • calculer N=P*Q => 8633
    • choisir e tel e premier avec delta => pgcd(e, delta)=1. Exemple e=7, pgcd(7, 8448) est bien égal à 1 => la clef publique sera le coupe (N, e) soit ici (8633, 7)
    • choisir une valeur "d" telle que (d * e) modulo delta = 1. Exemple d=1207 => 1207 * 7 = 8449 et 8449 modulo 8448 est bien égal à 1. La clef privée sera le couple (N, d) soit ici (8633, 1207)


    A partir de là, pour chiffrer une valeur (exemple) 555 sur la clef publique (N, e) on calcule (555^e) modulo N soit (555^7) % 8633 = 2928
    Et pour déchiffrer 2928 avec la clef privée (N, d) on calcule (2928^d) modulo N soit (2928^1207) % 8633 = 555

    Et pour signer c'est dans l'autre sens. Exemple on veut signer 667 via la clef privée (N, d) on calcule (667^d) modulo N soit (667^1207) % 8633 = 8625
    Et on vérifie la signature avec la clef publique (N, e) via (8625^e) modulo N soit (8625^7)%8633 ce qui redonne 667.

    Ci-joint un petit essai quand j'ai tenté du chiffrement en Python: Alice envoie un message vers Bob en utilisant la clef publique de Bob, et signe ce message en utilisant sa clef privée.
    Et Bob déchiffre le message avec sa clef privée et vérifie qu'il vient bien de Alice en checkant sa signature via la clef publique de Alice.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/env python3
    # coding: utf-8
     
    from Cryptodome.PublicKey import RSA
    from Cryptodome.PublicKey import RSA
    from Cryptodome.Cipher import PKCS1_OAEP
    from Cryptodome.Signature import PKCS1_PSS
    from Cryptodome.Hash import SHA
     
    message="Hello Woréld !!!"
    print(message, type(message))
     
    alice=RSA.generate(2048)
    bob=RSA.generate(2048)
    print(alice.publickey().exportKey())
    print(bob.publickey().exportKey())
     
    secret={
    	"chiffre" : PKCS1_OAEP.new(bob.publickey()).encrypt(message.encode("utf-8")),
    	"sign" : PKCS1_PSS.new(alice).sign(SHA.new(message.encode("utf-8"))),
    }
     
    final=PKCS1_OAEP.new(bob).decrypt(secret["chiffre"]).decode("utf-8")
    print("ok déchiffrement" if message == final else "erreur chiffrement")
     
    verify=PKCS1_PSS.new(alice.publickey()).verify(SHA.new(final.encode("utf-8")), secret["sign"])
    print("%s signature (%s)" % ("ok" if verify else "erreur", verify))
    Merci pour ta réponse qui est très claire !

    En fait, quelqu'un m'a demandé de l'aide sur leboncoin pour un devoir mais son sujet me parait flou et j'ai donc cherché de mon côté sans succès.

    Ci-joint l'énoncé :

    Nom : 1.png
Affichages : 116
Taille : 125,6 Ko

    et le projet 1 dont il est question

    Nom : 2.png
Affichages : 108
Taille : 117,2 Ko
    Ne connaissant pas le " Batch GCD" et n'ayant trouvé aucune documentation python dessus sur le web, je lui ai demandé ce qu'il en était et elle m'a répondu qu'elle supposait que c'était un pgcd classique ce qui paraissait étrange (d'où mes bêtises de vouloir transformé cette clé en un int qui n'a aucun sens et ne correspond à rien .... ^^' )

    Je ne sais pas quoi faire pour ce batch gcd... Aurais-tu une piste ?

    Encore désolé pour mes questions en chaîne d'autant plus qu'elles n'ont pas de sens :/

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Chaka_Sobek Voir le message
    Ne connaissant pas le " Batch GCD" et n'ayant trouvé aucune documentation python dessus sur le web
    C'est là qu'il est frustrant de ne pas voir comment vous vous dépatouillez avec votre moteur de recherche pour ne rien trouver sur Internet avec les mots clés "python batch gcd"...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Convertion char vers int
    Par barthelv dans le forum C
    Réponses: 8
    Dernier message: 08/10/2011, 21h45
  2. Réponses: 12
    Dernier message: 31/12/2005, 16h01
  3. [JDBC]ResultSet vers Int
    Par chti_juanito dans le forum JDBC
    Réponses: 2
    Dernier message: 29/10/2005, 14h08
  4. Conversion float vers int
    Par vargasvan dans le forum C
    Réponses: 2
    Dernier message: 05/10/2005, 17h29
  5. Conversion VARCHAR vers INT
    Par Slash dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/05/2005, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo