2017-11-22 1 views
1

문자열 형식으로 두 개의 키를 생성 할 수있는 방법이 서로 종속되어 있습니까?여러 개의 키로 PHP 암호화

  1. 마스터 키 (데이터를 해독하기 위해)
  2. 슬레이브 키 (마스터 키에 의존는, 데이터 만 암호를 해독 할 수 있습니다)
+1

"슬레이브"키 (여기서 공개 키)는 암호화하고 해독 할 수 없지만 "비대칭 암호화"라고합니다. 암호 해독의 경우 개인 키를 사용합니다. https://en.wikipedia.org/wiki/Public-key_cryptography – jeroen

+1

@jeroen'공개 키 [...]는 암호화 만 할 수 있고 해독 할 수 없습니다'는 정확하지 않습니다 : 두 키는 모두 암호화 및 해독 할 수 있지만 하나의 ** 다른 ** 키로 암호화 된 것을 해독하십시오. –

+0

@MatteoTassinari 항상 그렇지는 않습니다. 예를 들어 https://cs.stackexchange.com/questions/59675/can-a-public-key-be-used-to-decrypt-a-message-encrypted-by- the-corresponding-pri – jeroen

답변

2

아무것도 p

alice가 bobs 공개 키만을 사용하여 bob에게 암호화 된 메시지를 보내면 bob은 alice 공개 키만 사용하여 암호화 된 메시지로 응답하는 예제입니다.

두 경우 모두 자신의 개인 키를 사용하여 메시지의 암호를 해독합니다.

<?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; 
} 
+0

ㅎ, 좋은 캐롤 로렌스':-)' – halfer

+1

:) sooo embarrassing !!! 나는 항상 그 단어를 잘못 잡아 내 천적이야 !! –

0

예, 그것은 비대칭 암호화라고. 공개 키를 사용하여 데이터를 암호화 한 다음 개인 키를 사용하여 데이터를 해독합니다. 이것은 많은 장소에서 사용됩니다. blockchains에서 지불 포털 등

당신은 이해 여기에 몇 가지 유용한 알고리즘과 이론을 찾을 수 있습니다

: 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/

+0

안녕하세요, thx는 답변입니다! 그러나 그것이 내가 원하는 것만은 아닙니다. 공개 키를 개인 키에서 생성하는 방법을 찾고 있습니다. 또한 공개 키는 암호화하지 않고 콘텐츠의 암호화 만 해독 할 수 있어야합니다. 제 생각에는 두 대의 PC가 있어야합니다. 여전히 한 대의 PC에 개인 키가 있으며 공개 키를 생성 할 수 있습니다. 공개 키는 다른 PC에서 컨텐트의 암호를 해독하는 데만 사용할 수 있습니다. – marius

+0

공개 키 실제로 암호화가 허용되지 않습니다 – marius

관련 문제