On va utiliser OpenSSL pour générer une paire de clé privée / publique (la clé publique est extraite de la clé privée). toutes les fonctions de cryptage sont issues de OpenSSL
On encrypte toujours les données avec la clé publique. Une fois les données chiffrées, il n’est possible de les déchiffrer qu’avec la clé privée.
On prendra ici une clé de 4096 octets.
openssl genrsa -out prv.key 4096
openssl rsa -in prv.key -pubout > pub.key
Lors des différentes phases, il vaut mieux s’assurer que les données soient encodées simplement pour éviter les caractères non lisibles ou les gros tableaux d’octets. Le mieux est d’utiliser base64.
Encoder des données en PHP
// Loading public key
$pubKey = openssl_pkey_get_public(file_get_contents("./pub.key"));
// Data to encrypt
$data = 'this is sensitive data';
// Encrypt function
openssl_public_encrypt($data, $raw, $pub, OPENSSL_PKCS1_OAEP_PADDING);
// Display encrypted informations (raw is only bytes) :
$encrpyted = base64_encode($raw);
print $encrypted;
Décoder des données en PHP
// Loading private key
$prvKey = openssl_pkey_get_private(file_get_contents("./prv.key"));
// Data to decrypt (raw is only bytes)
$raw = base64decode($encryted);
// Decrypt function
openssl_private_decrypt($raw, $data, $prv, OPENSSL_PKCS1_OAEP_PADDING);
// Display decrypted informations :
print $data;
Encoder des données en Python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# Load public key
pubKey = RSA.importKey(open("./pub.key", 'r'))
# Data to encrypt
data = 'this is sensitive data'
# Encrypt function
cipher = PKCS1_OAEP.new(pubKey)
raw = cipher.encrypt(data)
# Display encrypted informations (raw is only bytes)
encrypted = raw.encode('base64')
print(encrypted)
Décoder de données en Python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# Loading private key
prvKey = RSA.importKey(open("./prv.key", 'r'))
# Data to decrypt (raw is only bytes)
raw = encrypted.decode('base64')
# Decrypt function
cipher = PKCS1_OAEP.new(prvKey)
data = cipher.decrypt(raw)
# Display decrypted informations :
print(data)