[Chiffrement] Génération clés (Elgamal)

Bonjour tout le monde,

Je reviens vers vous car je me heurte à un problème de chiffrement qui me dépasse..

Pour vous situer le contexte, il y a un développeur qui s'occupe de l'api du projet et il y a une partie du json qui va être chiffrée.
Je dois donc déchiffrer son contenu.
Il m'a listé toute les fonctions dont je vais avoir besoin côté iOs.

J'ai donc son code javascript et je dois refaire l'équivalent en swift.

Je bloque sur la génération de clés privées/publiques en utilisant le chiffrement ElGamal

Voici la fonction javascript que j'ai :

function generate_keypair () {
     var keypair = sjcl.ecc.elGamal.generateKeys(256) // On génère la paire de clefs asymétriques, (courbe P-256)
     console.log('[keypair]', keypair)
     var public_key = keypair.pub.get()
     var secret_key = keypair.sec.get()
     console.log('[public_key]', public_key)
     console.log('[secret_key]', secret_key)
     var public_key_base64 = sjcl.codec.base64.fromBits(public_key.x.concat(public_key.y))
     var secret_key_base64 = sjcl.codec.base64.fromBits(secret_key)
     console.log('[result]', {publickey: public_key_base64, secretkey: secret_key_base64})

     return {publickey: public_key_base64, secretkey: secret_key_base64}
  }

La ligne qui m'intéresse est : sjcl.ecc.elGamal.generateKeys(256)
Il utilise la librairie SJCL : https://github.com/bitwiseshiftleft/sjcl/

Quelqu'un sait comment générer une paire de clés privée/publique en swift en utilisant le chiffrement d'ElGamal ?

Merci de votre aide :)

Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur

    Ce n'est pas un sujet que je maîtrise, mais CryptoKit propose un chiffrement avec une courbe P-256.
    Utilise CryptoKit si tu peux!

  • Même réponse que Céroce. Il y a un framework de codage avec Swift. Regarde s'il ne contient pas déjà la solution a ton problème, ou des outils simplifiant ta tâche.

  • C'est pas un sujet que je maitrise non plus :D

    Du coup, merci pour ton aide, tu m'as débloqué pour générer les clés privées/publiques ^^

    Le code si ça peut aider les prochains..

     let keypair = P256.Signing.PrivateKey() // génération d'une paire de clés
    
     let private_key = keypair.rawRepresentation.base64EncodedString()   // clé privée
     print(private_key)
     print("------------")
    
     let public_key = keypair.publicKey // clé publique - DATA
     print(public_key)
     print("------------")
    
     let publicKeyString = public_key.rawRepresentation.base64EncodedString() // clé publique - STRING - à partager
     print(publicKeyString)
    

    Maintenant que j'ai mes clés privées/publiques, il faut que je chiffre un message et j'ai du mal à comprendre le principe :/

    Voici la fonction en javascript pour chiffrer :

    var c256 = sjcl.ecc.curves.c256;
    var publickeyBas64ToBits = sjcl.codec.base64.toBits(publickey);
    
    console.log(c256);
    console.log(publickey);
    console.log(publickeyBas64ToBits);
    
    var pub = new sjcl.ecc.elGamal.publicKey(
                        c256, 
                        publickeyBas64ToBits
                    )
    var ciphertext = sjcl.encrypt(pub, message)
    return ciphertext
    

    Je suis tombé sur ce lien aussi : https://www.andyibanez.com/posts/common-cryptographic-operations-with-cryptokit/

    Je retourne faire quelques tests..

  • Petit up sur ce post..

    Pour le chiffrement symétrique, c'est bon, j'ai réussi à m'en sortir (je posterai le projet quand tout fonctionnera, si ça peut aider quelqu'un d'autre un jour..)

    Je cherche a faire un chiffrement asymétrique (courbe p-256)

    Dans beaucoup d'exemples, ils utilisent bien la génération de clé asymétrique (ça c'est bien) mais finissent par utiliser un chiffrement symétrique (de ce que j'ai compris et c'est pas ce qui m'intéresse pour le coup).

    Est ce que quelqu'un a un exemple clair ou un lien d'un chiffrement asymétrique ?

    Je cherche un exemple qui utilise un "nonce/iv", un "tag" et un "cipher" (si ça parle a quelqu'un..)

    Merci de votre aide :)

Connectez-vous ou Inscrivez-vous pour répondre.