# Aide pour utiliser Ğ1lib.js

**URL:** https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287
**Category:** Support
**Created:** [27 May 2024 17:21 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287 "2024-05-27T17:21:08Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![Frederic\_Renault](https://forum.duniter.org/user_avatar/forum.duniter.org/frederic_renault/32/3778_2.png) [@Frederic\_Renault](https://forum.duniter.org/u/Frederic_Renault)
#### Post date: [27 May 2024 17:21 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/1 "2024-05-27T17:21:08Z")

</div>

Je voudrai arriver à utiliser l’outil comme keygen et jaklis en “CLI”  
et aussi dans la page du “navigateur”

Une version javascript est prévue ?

Moi, je n’ai toujours pas réussi à utiliser g1lib.js

```auto
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Duniter and IPFS Key Generator</title>
    <script src="https://cdn.jsdelivr.net/npm/g1lib@latest"></script>
</head>
<body>
    <h1>Duniter and IPFS Key Generator</h1>
    
    <label for="latitude">Latitude:</label>
    <input type="text" id="latitude" name="latitude"><br>
    
    <label for="longitude">Longitude:</label>
    <input type="text" id="longitude" name="longitude"><br>
    
    <button onclick="generateKeys()">Generate Keys</button>
    
    <h2>Duniter (G1) Public Key:</h2>
    <p id="duniterPubkey"></p>
    
    <h2>IPFS Public Key:</h2>
    <p id="ipfsPubkey"></p>
    
    <script>
        async function generateKeys() {
            const latitude = document.getElementById('latitude').value;
            const longitude = document.getElementById('longitude').value;
            
            const credentials = `_${latitude}_${longitude}`;
            const keyPair = await g1lib.keyPair.fromCredentials(credentials);
            const publicKey = keyPair.publicKey;
            
            // Duniter (G1) Public Key
            const duniterPubkey = publicKey;
            document.getElementById('duniterPubkey').textContent = duniterPubkey;
            
            // IPFS Public Key
            const ipfsPrefix = new Uint8Array([0x00, 0x24, 0x08, 0x01, 0x12, 0x20]);
            const ipfsPubkey = g1lib.b58.encode(new Uint8Array([...ipfsPrefix, ...publicKey]));
            document.getElementById('ipfsPubkey').textContent = ipfsPubkey;
        }
    </script>
</body>
</html>

```

Toujours ce bordel entre les versions pour node et pour browser des librairies ja  
`export declarations may only appear at top level of a module`

---

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [28 May 2024 07:18 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/2 "2024-05-28T07:18:14Z")

</div>

Je déplace ça dans un nouveau fil parce que ce sera plus facile à retrouver.

> [@Frederic\_Renault](#):
>
> arriver à utiliser l’outil comme keygen […] et aussi dans la page du “navigateur”

Pour générer des clés dans le navigateur, le mieux est d’utiliser une extension navigateur et de lui déléguer la partie crypto.

---

<div class="post-metadata">

### Author: ![Frederic\_Renault](https://forum.duniter.org/user_avatar/forum.duniter.org/frederic_renault/32/3778_2.png) [@Frederic\_Renault](https://forum.duniter.org/u/Frederic_Renault)
#### Post date: [28 May 2024 16:26 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/3 "2024-05-28T16:26:28Z")

</div>

merci @HugoTrentesaux  
peut être que @1000i100 peut apporter son aide?

---

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [28 May 2024 17:55 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/4 "2024-05-28T17:55:28Z")

</div>

Voici une démo d’utilisation de Ğ1lib en javascript dans une application vue :

→ [Hugo Trentesaux / g1lib demo · GitLab](https://git.duniter.org/HugoTrentesaux/g1lib-demo)

Et voici une version servie sur IPFS : [https://bafybeiee3qwcg5q74ulb4rqbif6esm3mjedubi4b754hprggfb2mgeu53a.ipfs.pagu.re/](https://bafybeiee3qwcg5q74ulb4rqbif6esm3mjedubi4b754hprggfb2mgeu53a.ipfs.pagu.re/)

---

<div class="post-metadata">

### Author: ![Frederic\_Renault](https://forum.duniter.org/user_avatar/forum.duniter.org/frederic_renault/32/3778_2.png) [@Frederic\_Renault](https://forum.duniter.org/u/Frederic_Renault)
#### Post date: [29 May 2024 01:02 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/5 "2024-05-29T01:02:00Z")

</div>

> [@HugoTrentesaux](#):
>
> Et voici une version servie sur IPFS : [https://bafybeiee3qwcg5q74ulb4rqbif6esm3mjedubi4b754hprggfb2mgeu53a.ipfs.pagu.re/](https://bafybeiee3qwcg5q74ulb4rqbif6esm3mjedubi4b754hprggfb2mgeu53a.ipfs.pagu.re/)

merci. superbe.  
pas habitué aux framework vue.js

J’en suis au niveau “ajax”… je charge des librairies et exécute les fonctions dans la page…

```auto
ipfs ls /ipfs/bafybeiee3qwcg5q74ulb4rqbif6esm3mjedubi4b754hprggfb2mgeu53a
QmXj1TmR2wAw6pKxQJGLh6hCGNtykenUuhV3Bmzu84ozWt - assets/
QmaSyMrhp7Y1bgw5hRDCzwLMgf6piNhawkkVpwUgZ94d3Q 4286 favicon.ico
QmW4YD35ttfDcATej5s9ZSZxbwETJ6GmL9SfaMce4PuWCj 430 index.html

```

```auto
ipfs cat /ipfs/bafybeiee3qwcg5q74ulb4rqbif6esm3mjedubi4b754hprggfb2mgeu53a/assets/index-qu9fWtog.js

```

“rétro ingénierie” difficile…

---

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [29 May 2024 08:15 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/6 "2024-05-29T08:15:06Z")

</div>

> [@Frederic\_Renault](#):
>
> pas habitué aux framework vue.js

Bah si tu veux que je t’aide, tu peux t’y mettre c’est facile.

> [@Frederic\_Renault](#):
>
> “rétro ingénierie” difficile…

Bah oui, tu choisis le chemin le plus difficile alors que je t’ai fourni les sources :

> [@HugoTrentesaux](#):
>
> → [Hugo Trentesaux / g1lib demo · GitLab](https://git.duniter.org/HugoTrentesaux/g1lib-demo)

voici la page de l’appli : [src/App.vue · master · Hugo Trentesaux / g1lib demo · GitLab](https://git.duniter.org/HugoTrentesaux/g1lib-demo/-/blob/master/src/App.vue?ref_type=heads)

```auto
<script setup lang="ts">
import { ref } from 'vue'
import * as g1lib from 'g1lib'

const id = ref('')
const passwd = ref('')
const res = ref('')

function compute() {
  g1lib.crypto.idSecPass2cleanKeys(id.value, passwd.value).then((v: any) => (res.value = v.pubKey))
}
</script>

<template>
  <h1>G1lib</h1>
  <div style="min-width: 40em">
    id <input v-model="id" @input="compute" /> <br />
    passwd <input v-model="passwd" @input="compute" /> <br />
    <span class="mono">{{ res }}</span>
  </div>
</template>

<style scoped>
.mono {
  font-family: monospace;
}
</style>

```

C’est pas plus compliqué que ça. Le reste n’est qu’emballage généré par la commande `pnpm create vue@latest`. Donc pour reproduire chez toi, c’est `git clone` puis `pnpm install` puis `pnpm run dev`. C’est tout (enfin bien sûr il faut installer pnpm et node).

---

<div class="post-metadata">

### Author: ![Frederic\_Renault](https://forum.duniter.org/user_avatar/forum.duniter.org/frederic_renault/32/3778_2.png) [@Frederic\_Renault](https://forum.duniter.org/u/Frederic_Renault)
#### Post date: [29 May 2024 13:50 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/7 "2024-05-29T13:50:09Z")

</div>

> [@HugoTrentesaux](#):
>
> > [@Frederic\_Renault](#):
> >
> > “rétro ingénierie” difficile…
> 
> Bah oui, tu choisis le chemin le plus difficile alors que je t’ai fourni les sources :

Je sais, mais un peu comme un aveugle, je dois toucher à tout et suivre tous la “tuyauterie” pour comprendre les fonctions de la machine que j’ai sous les yeux. Bien isoler où sont chaque parties, celles exécutées dans le navigateur et sur le serveur…

> **search**
>
> ```bash
> #!/bin/bash
> MY_PATH="`dirname \"$0\"`" # relative
> MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
> ME="${0##*/}"
> ## THIS IS A GREAT RETRO ENGINEERING AND CODE SNIFFING TOOLS
> clear
> [[! -s ~/.local/bin/${ME}]] && cp ${MY_PATH}/${ME} ~/.local/bin/ && echo "Auto Install into ~/.local/bin/${ME}"
> echo "------------------------------------------------------------------------------"
> if ["$1" == ""]; then
> echo " Nothing to search for!"
> else
> echo " Searching for "$1" recursively. Please Wait..."
> echo "------------------------------------------------------------------------------"
> grep -h -r --exclude-dir='.git*' -H --colour=always "$1" ./
> fi
> echo "------------------------------------------------------------------------------"
> if ["$2" != ""]; then
> echo " To replace \"$1\" whith \"$2\", please run"
> echo " grep -rl --exclude-dir='.git*' '$1' ./ | xargs sed -i 's~$1~$2~g'"
> fi
> exit 0
> 
> ```

`search` est mon outil favori pour explorer les variables et les fonctions  
Je code avec du bois et de l’argile. Un peu comme je fais mes cabanes, avec les matériaux du coin, légères, démontables, cousu ou cloué … 🛖 plutôt que vissé et cimenté…  
“nodejs” et ses framework js c’est du BTP pour faire des immeubles 🏗

* * *

## Essayons vue.js

> [@HugoTrentesaux](#):
>
> ```auto
> function compute() {
> g1lib.crypto.idSecPass2cleanKeys(id.value, passwd.value).then((v: any) => (res.value = v.pubKey))
> }
> 
> ```

ça à l’air simple… mais ça utilise plein de balises que je ne connais pas.

et ça commence pas top…

```auto
sudo apt install pnpm
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
E: Impossible de trouver le paquet pnpm

```

* * *

## L’UX recherchée…

Avoir les “5 outils du Web3” et pratiquer le partage de secrets ala [Diffie-Hellman](https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman)

Soit disposer dans le navigateur des outils pour fabriquer et utiliser une clefs publique et privée adressée en 2D (salt/pepper) et exprimée dans l’espace “G1” et “IPFS”, pour m’en servir comme avec [keygen](https://github.com/papiche/Astroport.ONE/blob/master/tools/keygen) et [natools](https://github.com/papiche/Astroport.ONE/blob/master/tools/natools.py) et **ipfs** pour hasher, (dé)chiffrer, signer, vérifier…

Tu crois pouvoir m’y aider ?  
En fait, je ne suis pas sûr qu’on puisse forcer la création de sa clef “ipns” avec [https://helia.io/](https://helia.io/) Si ce n’est pas possible, il y a cette double “DHT” ipfs à informer entre les ipfs navigateurs (éphémère) et serveur (online), ce qui peut nécessiter de développer une API //

Un des usages premier serait de publier des data sur la clef IPNS de la G1Pub connectée afin d’informer le réseau qu’un “sign on” a eu lieu. Puis enrichir le protocole de communication inter “clients” et “serveurs”… [comme c’est le cas entre les serveurs d’un essaim Astroport](https://astroport.copylaradio.com/12345). Pour la messagerie, pubsub (et le gossip p2p) a des limites… J’explore aussi le protocole [webRTC (avec vdo.ninja)](https://vdo.ninja)…

## NB

Quand on charge [https://cdn.jsdelivr.net/npm/g1lib@latest/browser/all.mjs](https://cdn.jsdelivr.net/npm/g1lib@latest/browser/all.mjs) directement dans une page, il y a toujours cette erreur…  
`Uncaught SyntaxError: export declarations may only appear at top level of a module all.mjs:5:8507` ça ne devrait pas dans la version browser ?

Faut que j’essaye [https://browserify.org/](https://browserify.org/) ..

---

<div class="post-metadata">

### Author: ![Frederic\_Renault](https://forum.duniter.org/user_avatar/forum.duniter.org/frederic_renault/32/3778_2.png) [@Frederic\_Renault](https://forum.duniter.org/u/Frederic_Renault)
#### Post date: [25 June 2024 16:35 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/8 "2024-06-25T16:35:00Z")

</div>

Sur le dépot g1lib les liens vers “Packages” sont cassés

- [g1lib\_\_for\_nodejs](https://libs.duniter.io/g1lib.js/public/dist/nodejs/v3.5.8.mjs)
- [g1lib\_\_for\_browser](https://libs.duniter.io/g1lib.js/public/dist/browser/v3.5.8.mjs)

avec `nacl.min.js` et `scrypt.min.js`  
J’ai réussi à progresser en arrivant à générer une clef pour “duniter” et “ipfs”  
et j’ai pu chiffrer… mais pas déchiffrer

> **code**
>
> ```auto
> <!DOCTYPE html>
> <html lang="fr">
> <head>
> <meta charset="UTF-8">
> <title>Générateur de clés Duniter/IPFS et Chiffrement/Déchiffrement</title>
> <script src="nacl.min.js"></script>
> <script src="scrypt.min.js"></script>
> </head>
> <body>
> <h1>Générateur de clés Duniter/IPFS</h1>
> <form id="keygenForm">
> <label for="username">Username:</label>
> <input type="text" id="username" required><br><br>
> <label for="password">Password:</label>
> <input type="text" id="password" required><br><br>
> <button type="submit">Générer les clés</button>
> </form>
> <div id="output"></div>
> 
> <h2>Chiffrement avec la clé publique</h2>
> <form id="encryptForm">
> <label for="publicKey">Clé publique:</label>
> <input type="text" id="publicKey" required><br><br>
> <label for="message">Message à chiffrer:</label>
> <textarea id="message" required></textarea><br><br>
> <button type="submit">Chiffrer</button>
> </form>
> <div id="encryptedOutput"></div>
> 
> <h2>Déchiffrement avec la clé privée</h2>
> <form id="decryptForm">
> <label for="privateKeySelect">Sélectionner une clé privée:</label>
> <select id="privateKeySelect"></select><br><br>
> <label for="encryptedMessage">Message chiffré:</label>
> <textarea id="encryptedMessage" required></textarea><br><br>
> <button type="submit">Déchiffrer</button>
> </form>
> <div id="decryptedOutput"></div>
> 
> <script>
> const BASE58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
> let generatedKeys = [];
> 
> function to_b58(B, A = BASE58) {
> var d = [], s = "", i, j, c, n;
> for (i in B) {
> j = 0, c = B[i];
> s += c || s.length ^ i ? "" : 1;
> while (j in d || c) {
> n = d[j];
> n = n ? n * 256 + c : c;
> c = n / 58 | 0;
> d[j] = n % 58;
> j++
> }
> }
> while (j--) s += A[d[j]];
> return s;
> }
> 
> function from_b58(S, A = BASE58) {
> var d = [], b = [], i, j, c, n;
> for (i in S) {
> j = 0, c = A.indexOf(S[i]);
> if (c < 0) return undefined;
> c || b.length ^ i ? i : b.push(0);
> while (j in d || c) {
> n = d[j];
> n = n ? n * 58 + c : c;
> c = n >> 8;
> d[j] = n % 256;
> j++
> }
> }
> while (j--) b.push(d[j]);
> return new Uint8Array(b);
> }
> 
> async function generateDuniterKey(username, password) {
> const scryptParams = {
> N: 4096,
> r: 16,
> p: 1,
> dkLen: 32
> };
> 
> const salt = new TextEncoder().encode(username);
> const passwordBytes = new TextEncoder().encode(password);
> 
> const derivedKey = await scrypt.scrypt(passwordBytes, salt, scryptParams.N, scryptParams.r, scryptParams.p, scryptParams.dkLen);
> 
> const keyPair = nacl.sign.keyPair.fromSeed(new Uint8Array(derivedKey));
> 
> const publicKey = to_b58(keyPair.publicKey);
> const privateKey = to_b58(keyPair.secretKey);
> 
> return { publicKey, privateKey };
> }
> 
> function formatDuniterKey(publicKey, privateKey) {
> return `PubSec:${publicKey}:${privateKey}`;
> }
> 
> function formatIPFSKey(publicKey, privateKey) {
> const publicKeyBytes = from_b58(publicKey);
> const privateKeyBytes = from_b58(privateKey);
> const publicProtobuf = new Uint8Array([0, 36, 8, 1, 18, 32, ...publicKeyBytes]);
> const privateProtobuf = new Uint8Array([8, 1, 18, 64, ...privateKeyBytes]);
> 
> return {
> id: to_b58(publicProtobuf),
> privKey: btoa(String.fromCharCode.apply(null, privateProtobuf))
> };
> }
> 
> function encryptMessage(publicKey, message) {
> const publicKeyUint8 = from_b58(publicKey);
> const messageUint8 = new TextEncoder().encode(message);
> const ephemeralKeyPair = nacl.box.keyPair();
> const nonce = nacl.randomBytes(nacl.box.nonceLength);
> const sharedKey = nacl.box.before(publicKeyUint8, ephemeralKeyPair.secretKey);
> const encrypted = nacl.secretbox(messageUint8, nonce, sharedKey);
> 
> const fullMessage = new Uint8Array(ephemeralKeyPair.publicKey.length + nonce.length + encrypted.length);
> fullMessage.set(ephemeralKeyPair.publicKey);
> fullMessage.set(nonce, ephemeralKeyPair.publicKey.length);
> fullMessage.set(encrypted, ephemeralKeyPair.publicKey.length + nonce.length);
> 
> return to_b58(fullMessage);
> }
> 
> function decryptMessage(privateKey, encryptedMessage) {
> try {
> const privateKeyUint8 = from_b58(privateKey);
> const fullMessageUint8 = from_b58(encryptedMessage);
> 
> const ephemeralPublicKey = fullMessageUint8.slice(0, nacl.box.publicKeyLength);
> const nonce = fullMessageUint8.slice(nacl.box.publicKeyLength, nacl.box.publicKeyLength + nacl.box.nonceLength);
> const ciphertext = fullMessageUint8.slice(nacl.box.publicKeyLength + nacl.box.nonceLength);
> 
> const sharedKey = nacl.box.before(ephemeralPublicKey, privateKeyUint8);
> const decrypted = nacl.secretbox.open(ciphertext, nonce, sharedKey);
> 
> if (decrypted === null) {
> throw new Error("Déchiffrement échoué");
> }
> 
> return new TextDecoder().decode(decrypted);
> } catch (error) {
> throw new Error("Erreur de déchiffrement : " + error.message);
> }
> }
> 
> async function generateKeys() {
> const username = document.getElementById('username').value;
> const password = document.getElementById('password').value;
> 
> try {
> const keys = await generateDuniterKey(username, password);
> const duniterKey = formatDuniterKey(keys.publicKey, keys.privateKey);
> const ipfsKey = formatIPFSKey(keys.publicKey, keys.privateKey);
> 
> generatedKeys.push(keys);
> updatePrivateKeySelect();
> 
> const output = document.getElementById('output');
> output.innerHTML = `
> <h2>Clé Duniter :</h2>
> <pre>${duniterKey}</pre>
> <h2>Clé IPFS :</h2>
> <pre>${JSON.stringify(ipfsKey, null, 2)}</pre>
> `;
> 
> document.getElementById('publicKey').value = keys.publicKey;
> } catch (error) {
> console.error('Erreur lors de la génération des clés:', error);
> document.getElementById('output').innerHTML = `<p>Erreur : ${error.message}</p>`;
> }
> }
> 
> function updatePrivateKeySelect() {
> const select = document.getElementById('privateKeySelect');
> select.innerHTML = '';
> generatedKeys.forEach((keys, index) => {
> const option = document.createElement('option');
> option.value = keys.privateKey;
> option.textContent = `Clé ${index + 1} (Publique: ${keys.publicKey.substr(0, 10)}...)`;
> select.appendChild(option);
> });
> }
> 
> document.getElementById('keygenForm').addEventListener('submit', function(e) {
> e.preventDefault();
> generateKeys();
> });
> 
> document.getElementById('encryptForm').addEventListener('submit', function(e) {
> e.preventDefault();
> const publicKey = document.getElementById('publicKey').value;
> const message = document.getElementById('message').value;
> const encryptedMessage = encryptMessage(publicKey, message);
> 
> const encryptedOutput = document.getElementById('encryptedOutput');
> encryptedOutput.innerHTML = `
> <h3>Message chiffré :</h3>
> <pre>${encryptedMessage}</pre>
> `;
> 
> document.getElementById('encryptedMessage').value = encryptedMessage;
> });
> 
> document.getElementById('decryptForm').addEventListener('submit', function(e) {
> e.preventDefault();
> const privateKey = document.getElementById('privateKeySelect').value;
> const encryptedMessage = document.getElementById('encryptedMessage').value;
> 
> try {
> const decryptedMessage = decryptMessage(privateKey, encryptedMessage);
> const decryptedOutput = document.getElementById('decryptedOutput');
> decryptedOutput.innerHTML = `
> <h3>Message déchiffré :</h3>
> <pre>${decryptedMessage}</pre>
> `;
> } catch (error) {
> console.error('Erreur lors du déchiffrement:', error);
> document.getElementById('decryptedOutput').innerHTML = `<p>Erreur de déchiffrement : ${error.message}</p>`;
> }
> });
> </script>
> </body>
> </html>
> 
> ```

online: [/ipfs/QmQZyqA6heDkz4SJmw2NHxnwEJKKqwBZnGbwAZh75tJjdZ](http://ipfs.asycn.io/ipfs/QmQZyqA6heDkz4SJmw2NHxnwEJKKqwBZnGbwAZh75tJjdZ/)

 ![oup](https://forum.duniter.org/uploads/default/original/2X/f/fd8c65966240049fa3141378222467a080e7bbc7.png)

---

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [25 June 2024 17:03 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/9 "2024-06-25T17:03:11Z")

</div>

Pas mal cette petite appli 🙂

Effectivement quand je tente de déchiffrer j’ai

> Erreur de déchiffrement : Erreur de déchiffrement : bad secret key size

Le test qui couvre le déchiffrement est ici : [src/crypto.test.mjs · main · libs / G1lib.js · GitLab](https://git.duniter.org/libs/g1lib.js/-/blob/main/src/crypto.test.mjs?ref_type=heads#L175). Est-ce que ça t’aide ? Sinon ça peut être bien de demander de l’aide à @1000i100 (et aussi pour réparer les liens cassés suite à l’abandon de `duniter.io`).

---

<div class="post-metadata">

### Author: ![1000i100](https://forum.duniter.org/user_avatar/forum.duniter.org/1000i100/32/825_2.png) [@1000i100](https://forum.duniter.org/u/1000i100)
#### Post date: [24 July 2024 20:04 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/10 "2024-07-24T20:04:21Z")

</div>

J’ai repris le proto d’ @HugoTrentesaux et j’y ai ajouter de quoi chiffrer et déchiffré :

> **[1000i100 (!1) · Merge requests · Hugo Trentesaux / g1lib demo · GitLab](https://git.duniter.org/HugoTrentesaux/g1lib-demo/-/merge_requests/1)**
>
> Permet de chiffrer et déchiffrer des messages avec compatibilité cesium.

---

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [10 October 2024 15:07 UTC](https://forum.duniter.org/t/aide-pour-utiliser-g1lib-js/12287/11 "2024-10-10T15:07:15Z")

</div>

Et tu as même mis une version en ligne : [https://1000i100.pages.duniter.org/g1lib-webui-demo/](https://1000i100.pages.duniter.org/g1lib-webui-demo/)
