Шифрование PHP RSA с использованием закрытого ключа и PKCS1

Мне нужно зашифровать строку, используя RSA, PKCS1, закрытый ключ и PHP. Я не смог найти даже команду терминала, которую можно использовать с exec(). Кто-нибудь знает, как это сделать?

Спасибо!


person Udinesio    schedule 04.01.2011    source источник


Ответы (3)


Попробуйте phpseclib, реализацию RSA на чистом PHP:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
//extract($rsa->createKey());

$plaintext = 'terrafrost';

$rsa->loadKey($privatekey);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($plaintext);

echo $plaintext;
?>

Предупреждение о безопасности. Если вы собираетесь использовать phpseclib, убедитесь, что вы следуйте рекомендациям по шифрованию RSA. См. также этот ответ для получения более подробной информации и альтернативного подхода.

person Community    schedule 09.01.2011

openssl aes-256-cbc -a -salt -in inputfile.txt -out encryptedfile.txt -pass pass:thepassword
openssl aes-256-cbc -d -a -in encryptedfile.txt -out decryptedfile.txt 

Может выполнить их и должен иметь возможность изменить шифр по мере необходимости.

person profitphp    schedule 04.01.2011
comment
Для справки: любой пользователь на сервере может анализировать командную строку запущенных программ, предоставление паролей через командную строку для всего, кроме локального тестирования с фиктивными данными, — ПЛОХАЯ идея. - person Creshal; 02.04.2012

Если у вас включено расширение php_openssl, вы можете сделать это без использования командной строки, кроме создания ключей. И вы даже можете создать ключи с помощью php, если хотите.

Сгенерируйте свои ключи

Это команды оболочки для создания ключей. Вы можете запустить их в Linux, Mac, Cygwin или даже в Windows Git BASH.

Создайте 512-битный закрытый ключ rsa. Это попросит вас ввести пароль. Вы должны хранить это безопасно.

openssl genrsa -des3 -out private.pem 512

Сгенерируйте открытый ключ на основе закрытого ключа. Вы можете хранить это небезопасным образом.

openssl rsa -in private.pem -pubout -out public.pem

Используйте PHP для шифрования/дешифрования данных с помощью ваших ключей

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

<?php
$privateKeyPassphrase = "mypassword";
$sensitiveData = "This is the data that we want to encrypt.";

/*
// Load the keys from a file (as you would most likely do in a production environment)
$priv_key_file_name = realpath("private.pem");
$publ_key_file_name = realpath("public.pem");

// Note: This function needs an array of parameters!
$privateKey = openssl_pkey_get_private(array("file://$priv_key_file_name", $privateKeyPassphrase));
$publicKey = openssl_pkey_get_public(array("file://$publ_key_file_name", $privateKeyPassphrase));
*/

// Get keys from a string so that this example can be run without the need for extra files
$privateKeyString = <<<PK
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,D21679087FE8490E

hXTtfXC4qYNoE9hySVwPD+Mwhb7RiCae589Z952Z+ucz9i8j+1MO4Sx2nOMCH5Eg
uotMSr3FipJ/Bqbh66AqqYK3PG7NFYA41f/7xrTA6gwq6MDjmAy6z8TW+NE3OCpF
n+9zPzT15wcNm4U4ZRpEO+Fi8cYTLu0LlX+k8Djrd+CuS6wX4p8SgpAplDrnAiAH
z3sJtf2+M67yTNT7v/hIJmkebCwES43pTlNrxluJpD7HBl4BGmFWFI+MJ/gPuFn6
etQjDpzgep0Wn4FKi34IkDQ9kM4/9tWy0Fhf8ytdg0NZshMt/PWRPrNrs+2qLoJu
1rHc0rtKVvALQOKU+SbxaYVBlEzelxB0XJ2uQMSIs46vHZiUG3Q2JBmlxRshHQse
8n9CAYmwm++cPmXq06rVMclCJR0pDlOzGQvIgmo4eiY=
-----END RSA PRIVATE KEY-----
PK;

$publicKeyString = <<<PK
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKcNEHgry/zIFpKdKz2E/ksoDkBn00K7
v2CxB2kHMWjAxgaFPCYs/8gHclSkcJYARKqvU/0Gsc0mrrPtCs5CytcCAwEAAQ==
-----END PUBLIC KEY-----
PK;

// Load private key
$privateKey = openssl_pkey_get_private(array($privateKeyString, $privateKeyPassphrase));

// Load public key
$publicKey = openssl_pkey_get_public(array($publicKeyString, $privateKeyPassphrase));

if (!$privateKey) {
    echo "Private key NOT OK\n";
}

if (!$publicKey) {
    echo "Public key NOT OK\n";
}

if (!openssl_private_encrypt($sensitiveData, $encryptedWithPrivate, $privateKey)) {
    echo "Error encrypting with private key\n";
}

if (!openssl_public_encrypt($sensitiveData, $encryptedWithPublic, $publicKey)) {
    echo "Error encrypting with public key\n";
}

if (!openssl_private_decrypt($encryptedWithPublic, $decryptedWithPrivateFromPublic, $privateKey)) {
    echo "Error decrypting with private key what was encrypted with public key\n";
}

if (!openssl_public_decrypt($encryptedWithPrivate, $decryptedWithPublicFromPrivate, $publicKey)) {
    echo "Error decrypting with public key what was encrypted with private key\n";
}

echo "Encrypted with public key: " . base64_encode($encryptedWithPublic) . "\n"; // This is different every time
echo "Encrypted with private key: " . base64_encode($encryptedWithPrivate) . "\n";
echo "Decrypted with private key what was encrypted with public key: " . $decryptedWithPrivateFromPublic . "\n";
echo "Decrypted with public key what was encrypted with private key: " . $decryptedWithPublicFromPrivate . "\n";
person Julian    schedule 18.02.2012
comment
Забыл упомянуть, что в реальной ситуации вы бы использовали ключ 1024/2048/4096 бит. Я использовал здесь 512 бит, чтобы код не был таким длинным. - person Julian; 18.02.2012