# [Debian] OpenSSL

## Introduction

Openssl est une bibliothèque standard de chiffrement disponible sur les systèmes Unix.

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-10/scaled-1680-/image.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-10/image.png)

## Chiffrement de fichier

Vous pouvez chiffrer un fichier en AES-256-CBC avec un mot de passe grâce à la commande suivante :

```bash
openssl enc -aes-256-cbc -salt -pbkdf2 -in <INPUT_FILE> -out <OUTPUT_FILE> -base64 -k <PASSPHRASE>
```

Et pour déchiffrer :

```bash
openssl enc -d -aes-256-cbc -pbkdf2 -in <INPUT_FILE> -out <OUTPUT_FILE> -base64 -k <PASSPHRASE>
```

Pour créer une paire de clés publique/privée RSA puis chiffrer un fichier avec, on peut utiliser openssl.

Tout d'abord, générez la paire de clés :

- Clé privée :

```bash
openssl genpkey -algorithm RSA -out priv.pem -aes-256-cbc -pass pass:mypass
```

- Clé publique :

```bash
openssl rsa -pubout -in key.pem -out pub.pem -passin pass:mypass
```

Puis chiffrez un fichier avec la clé publique :

```bash
openssl pkeyutl -encrypt -inkey pub.pem -pubin -in plain.txt -out cypher.enc && openssl base64 -in cypher.enc -out cypher.enc.base64
```

Puis pour déchiffrer avec la clé privée :

```bash
openssl base64 -d -in cypher.enc.base64 -out cypher.enc && openssl pkeyutl -decrypt -inkey priv.pem -in cypher.enc -out plain_decrypted.txt
```

## Échange de clé

On peut utiliser **Diffie Hellman** pour échanger des clés.

Pour cela, commencez par créer un paramètre DH :

```bash
openssl genpkey -genparam -algorithm DH -out dhp.prem
```

Puis on peut générer une première clé :

```bash
openssl genpkey -paramfile dhp.pem -out dhkey1.pem
```

On peut afficher les informations de cette clé :

```bash
openssl pkey -in dhkey1.pem -text -noout
```

Et on peut créer une deuxième clé :

```bash
openssl pkey -in dhkey1.pem -pubout -out dhpub1.pem
```

On peut afficher les informations de cette clé :

```bash
openssl pkey -pubin -in dhpub1.pem -text
```

On peut ensuite créer une dérivation de ces clés :

```bash
openssl pkeyutil -derive -inkey dhkey1.pem -peerkey dhpub1.pem -out secret1.bin
```

```bash
openssl pkeyutil -derive -inkey dhkey2.pem -peerkey dhpub2.pem -out secret2.bin
```

On peut ensuite comparer les deux secrets et s'apercevoir qu'ils sont identiques :

```bash
cmp secret1.bin secret2.bin
```

## Génération de clés ECC

Les clés ECC suivent les courbes elliptiques ce qui permet une taille de clé réduite en conservant un bon niveau de sécurité.

#### Création d'une clé ECC

```bash
openssl ecparam -genkey -name prime256v1 -out ecc.key
```

#### Demande de certificat

```bash
openssl req -new -sha256 -key ecc.key -nodes -out ecc.csr
```

#### Signer le certificat

Ici nous allons auto-signer le certificat, si vous utilisez une autorité de certification (CA), utilisez la clé privée du CA :

```bash
openssl req -x509 -sha256 -days 365 -key ecc.key -in ecc.csr -out ecc.crt
```

#### Extraire la clé publique

```bash
openssl ec -in net-sec.key -pubout
```