PHP-шифрование с несколькими ключами

Есть ли способ создать два ключа в строчном формате, которые зависят друг от друга?

  1. Мастер-ключ (для дешифрования данных)
  2. Ведомый ключ (в зависимости от главного ключа, может только расшифровать данные)

Ничего похожего на историю кода, чтобы объяснить концепцию; p

Вот пример, когда alice отправляет зашифрованное сообщение в bob, используя только открытый ключ bobs, bob затем отвечает зашифрованным сообщением, используя только открытый ключ alices.

В обоих случаях их собственные секретные ключи используются для дешифрования сообщений.

 <?php // define an example, our people, messages and their keys $people = [ 'alice' => [ 'keys' => gen_keys(), 'msg' => 'Hi Bob, I\'m sending you a private message' ], 'bob' => [ 'keys' => gen_keys(), 'msg' => 'Thanks Alice, message received' ] ]; // $encrypted = $decrypted = [ 'alice' => '', 'bob' => '' ]; // public keys get exchanged, not private // alice encrypts her message to bob $encrypted['bob'] = encrypt( $people['alice']['msg'], // message to encrypt $people['bob']['keys']['public'] // bobs public key, which he sent to alice ); // message sent to bob // bob decrypts his message $decrypted['bob'] = decrypt( $encrypted['bob'], // message to decrypt $people['bob']['keys']['private'] // bob's private key, which he uses to decrypt the message ); // bob now responds // bob encrypts his message to alice $encrypted['alice'] = encrypt( $people['bob']['msg'], // message to encrypt $people['alice']['keys']['public'] // alice public key, which she sent to bob ); // alice decrypts her message $decrypted['alice'] = decrypt( $encrypted['alice'], // message to decrypt $people['alice']['keys']['private'] // alice's private key, which she uses to decrypt the message ); // print_r($decrypted); /* Array ( [alice] => Thanks Alice, message received [bob] => Hi Bob, I'm sending you a private message ) */ /** * Functions - wraps for openssl operations */ // generate public and private key pair function gen_keys() { $res = openssl_pkey_new(array('private_key_bits' => 2048)); /* Extract the private key */ openssl_pkey_export($res, $privateKey); /* Extract the public key */ $publicKey = openssl_pkey_get_details($res); return ['public' => $publicKey["key"], 'private' => $privateKey]; } // encrypt using public key function encrypt($msg, $key) { $ret = ''; openssl_public_encrypt( $msg, // message to encrypt $ret, // &encrypted message $key // public key ); return $ret; } // decrypts using private key function decrypt($msg, $key) { $ret = ''; openssl_private_decrypt( $msg, // message to decrypt $ret, // &decrypted message $key // private key ); return $ret; } 

Да, это называется асимметричной криптографией . Данные шифруются с помощью открытого ключа, а затем закрытый ключ используется для дешифрования данных. Это используется во многих местах, например, в блок-цепях, платежных порталах и т. Д.

Здесь вы можете найти полезные алгоритмы и теории: https://www.tutorialspoint.com/cryptography/public_key_encryption.htm

В PHP вы можете использовать – openssl_encrypt() & openssl_decrypt() – чтобы получить аналогичный результат или – base64_encode() и base64_decode() или вы можете смешивать оба, чтобы получить более защищенное решение.

Одним простым примером может быть:

 function my_simple_crypt( $string, $action = 'e' ) { // you may change these values to your own $secret_key = 'my_simple_secret_key'; $secret_iv = 'my_simple_secret_iv'; $output = false; $encrypt_method = "AES-256-CBC"; $key = hash( 'sha256', $secret_key ); $iv = substr( hash( 'sha256', $secret_iv ), 0, 16 ); if( $action == 'e' ) { $output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) ); } else if( $action == 'd' ){ $output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv ); } return $output; } 

Чтобы зашифровать:

 $encrypted = my_simple_crypt( 'Hello World!', 'e' ); 

Чтобы расшифровать:

 $decrypted = my_simple_crypt( 'Hello World!', 'd' ); 

Источник: https://nazmulahsan.me/simple-two-way-function-encrypt-decrypt-string/