문자열 형식으로 두 개의 키를 생성 할 수있는 방법이 서로 종속되어 있습니까?여러 개의 키로 PHP 암호화
- 마스터 키 (데이터를 해독하기 위해)
- 슬레이브 키 (마스터 키에 의존는, 데이터 만 암호를 해독 할 수 있습니다)
문자열 형식으로 두 개의 키를 생성 할 수있는 방법이 서로 종속되어 있습니까?여러 개의 키로 PHP 암호화
아무것도 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;
}
ㅎ, 좋은 캐롤 로렌스':-)' – halfer
:) sooo embarrassing !!! 나는 항상 그 단어를 잘못 잡아 내 천적이야 !! –
예, 그것은 비대칭 암호화라고. 공개 키를 사용하여 데이터를 암호화 한 다음 개인 키를 사용하여 데이터를 해독합니다. 이것은 많은 장소에서 사용됩니다. 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/
"슬레이브"키 (여기서 공개 키)는 암호화하고 해독 할 수 없지만 "비대칭 암호화"라고합니다. 암호 해독의 경우 개인 키를 사용합니다. https://en.wikipedia.org/wiki/Public-key_cryptography – jeroen
@jeroen'공개 키 [...]는 암호화 만 할 수 있고 해독 할 수 없습니다'는 정확하지 않습니다 : 두 키는 모두 암호화 및 해독 할 수 있지만 하나의 ** 다른 ** 키로 암호화 된 것을 해독하십시오. –
@MatteoTassinari 항상 그렇지는 않습니다. 예를 들어 https://cs.stackexchange.com/questions/59675/can-a-public-key-be-used-to-decrypt-a-message-encrypted-by- the-corresponding-pri – jeroen