Есть ли способ создать два ключа в строчном формате, которые зависят друг от друга?
Ничего похожего на историю кода, чтобы объяснить концепцию; 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/