2013-06-25 6 views
2

Я хочу создать систему шифрования сообщений, в которой пользователи отправят сообщение в зашифрованном виде. Я использую GnUPG.I получил помощь от http://www.php.net/manual/en/gnupg.installation.php, чтобы установить GnUPG. После установки на сервере, я создать общественный и частный брелок следуя кодСистема шифрования сообщений GnuPG

$GeneratedKey = $gpg->GenKey($name, $comment, $email, $passphrase,$ExpireDate, $KeyType, $KeyLength,$SubkeyType, $SubkeyLength); 

function GenKey($RealName, $Comment, $Email, $Passphrase = '', $ExpireDate = 0, $KeyType = 'DSA', $KeyLength = 1024, $SubkeyType = 'ELG-E', $SubkeyLength = 1024) 
{ 
    // validates the keytype 
    if (($KeyType != 'DSA') && ($KeyType != 'RSA')) { 
     $this->error = 'Invalid Key-Type, the allowed are DSA and RSA'; 
     return false; 
    } 

    // validates the subkey 
    if ((!empty($SubkeyType)) && ($SubkeyType != 'ELG-E')) { 
     $this->error = 'Invalid Subkey-Type, the allowed is ELG-E'; 
     return false; 
    } 

    // validate the expiration date 
    if (!preg_match('/^(([0-9]+[dwmy]?)|([0-9]{4}-[0-9]{2}-[0-9]{2}))$/', $ExpireDate)) { 
     $this->error = 'Invalid Expire Date, the allowed values are <iso-date>|(<number>[d|w|m|y])'; 
     return false; 
    } 

    // generates the batch configuration script 
    $batch_script = "Key-Type: $KeyType\n" . 
     "Key-Length: $KeyLength\n"; 
    if (($KeyType == 'DSA') && ($SubkeyType == 'ELG-E')) 
     $batch_script .= "Subkey-Type: $SubkeyType\n" . 
      "Subkey-Length: $SubkeyLength\n"; 
    $batch_script .= "Name-Real: $RealName\n" . 
     "Name-Comment: $Comment\n" . 
     "Name-Email: $Email\n" . 
     "Expire-Date: $ExpireDate\n" . 
     "Passphrase: $Passphrase\n" . 
     "%commit\n" . 
     "%echo done with success\n"; 

    // initialize the output 
    $contents = ''; 

    // execute the GPG command 
    if ($this->_fork_process($this->program_path . ' --homedir ' . $this->home_directory . 
      ' --batch --status-fd 1 --gen-key', 
     $batch_script, $contents)) { 
     $matches = false; 
     if (preg_match('/\[GNUPG:\]\sKEY_CREATED\s(\w+)\s(\w+)/', $contents, $matches)) 
      return $matches[2]; 
     else 
      return true; 
    } else 
     return false; 
} 

зашифровать следующий кодом

$gpg = new gnupg(); 
$gpg->addencryptkey($recipient); 
$ciphertext = $gpg->encrypt($plaintext); 

Расшифровать следующего код

$gpg = new gnupg(); 
$gpg->adddecryptkey($recipient, $receiver_passphrase); 
$plain = $gpg->decrypt($encrypted_text, $plaintext); 

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

Возможно ли генерировать открытый и закрытый ключ в локальный компьютер? Потому что я не хочу, чтобы пользователь зависел от безопасности сервера. Только получатель будет в состоянии расшифровать сообщение .. Не другие будут в состоянии расшифровать ..

спасибо,

ответ

3

Вы можете создавать ключи с помощью OpenPGP.js, который работает в браузере вашего клиента, хранить закрытый ключ где-то с клиентом и отправить ничего, кроме публичного, на сервер.

// Create new key with RSA encryption (1), 4k length for 
// John Doe with password "foobar" 
var keys = openpgp.generate_key_pair(1, 4096, 
      "John Doe [email protected]", "foobar"); 
keys.privateKeyArmored; // Access private key 
keys.publicKeyArmored; // Access public key 
+0

Теперь у них даже есть якоря, поэтому я мог бы предоставить глубокую ссылку. –

+0

Спасибо! (Я почти соблазн использовать это, если мне когда-либо понадобится перестроить какой-то серверный код, gnupg-python оказался довольно беспорядочным, а нацеливание на Node из ClojureScript не может быть более болезненным). –