Метод кодирования RS256 в PHP - PullRequest
1 голос
/ 29 января 2020

Мне нужно использовать собственный метод ключа JWT, и я должен использовать метод RSA256, но когда я пытаюсь это сделать:

$sha256 = hex2bin("3031300d060960864801650304020105000420").hash("sha256",$data,true);
$encrypt_rsa = openssl_private_encrypt($sha256, $partialEncrypted, $privateKey, OPENSSL_PKCS1_PADDING);
$encrypted .= $partialEncrypted;

, возвращается мне следующее:

]YXzn_U]f
                   " >@ќw
                         -<Bt
                             TD6W7  y͜CE    ^fa~N5[l<%xn1b>Eh3j}0D,eL5]q}$Vpg
fq/;~g7>r0M3Հ$WMA;?Y̶g DA|v7܄C%wɑ7{mh L

и когда я пытаюсь декодировать этим методом:

$decrypt_rsa = openssl_public_decrypt($function_rsa, $partialDecrypted, $certificate, OPENSSL_PKCS1_PADDING);
$decrypted .= $partialDecrypted;

, он ничего не возвращает.

Я знаю, что в моем методе кодирования есть ошибка, но я не знаю почему.

Спасибо:)

1 Ответ

1 голос
/ 29 января 2020

$sha256 содержит непечатаемые символы и поэтому должен отображаться в правильной кодировке, например, шестнадцатеричное с использованием bin2hex. Это также относится к $encrypted. $function_rsa в настоящее время не определено. Предполагая, что это ошибка копирования / вставки и $function_rsa соответствует $encrypted, код работает, то есть $decrypted равно $sha256:

<?php

// Create a test key pair
$keypair = openssl_pkey_new(array("private_key_bits" => 2048));
openssl_pkey_export($keypair, $privateKey);
$publicKey = openssl_pkey_get_details($keypair);
$publicKey = $publicKey["key"];

$data = "The quick brown fox jumps over the lazy dog";

// Encrypt
$encrypted = "";
$sha256 = hex2bin("3031300d060960864801650304020105000420").hash("sha256", $data, true);
$encrypt_rsa = openssl_private_encrypt($sha256, $partialEncrypted, $privateKey, OPENSSL_PKCS1_PADDING);
$encrypted .= $partialEncrypted;

// Decrypt
$decrypted = "";
$decrypt_rsa = openssl_public_decrypt($encrypted, $partialDecrypted, $publicKey, OPENSSL_PKCS1_PADDING);
$decrypted .= $partialDecrypted;

// Compare
print("Original data:  " . bin2hex($sha256) . "\nEncrypted data: " . bin2hex($encrypted) . "\nDecrypted data: " . bin2hex($decrypted));

?>

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

Шифрование ha sh с предшествующим идентификатором ha sh соответствует подписи данных, из которых был сгенерирован ha sh с использованием RSASSA-PKCS1-v1_5- набивка ( RF C 8017 ). Обратите внимание, что подпись данных может быть сгенерирована намного проще с помощью openssl_sign:

$getPrivate = openssl_pkey_get_private($privateKey);
openssl_sign($data, $signature, $getPrivate, "sha256WithRSAEncryption");
print("\nSignature:      " . bin2hex($signature));
...