Я работаю над попыткой реализовать механизм шифрования для передачи защищенной информации на мой сайт.Мой хост взимает дополнительную плату за SSL, и я не готов к дополнительным денежным обязательствам.
Я пытался использовать pidCrypt для шифрования значений на стороне клиента с помощью JavaScript.Затем я попробовал несколько методов для дешифрования на стороне PHP.По какой-то причине данные просто искажаются.
Может кто-то указать, что я делаю неправильно?Или я должен использовать другую библиотеку JavaScript для шифрования?Любой совет?
Вот код javascript, который извлекает текст для шифрования из ввода на странице и открытый ключ из скрытой текстовой области на странице.
$(document).ready(function() {
$('button').click(function() {
var dataToSend = new Object();
var input = $('input[name=textToEncrypt]').val();
var public_key = $('textarea[name=publicKey]').val();
var params = certParser(public_key);
var key = pidCryptUtil.decodeBase64(params.b64);
//new RSA instance
var rsa = new pidCrypt.RSA();
//RSA encryption
//ASN1 parsing
var asn = pidCrypt.ASN1.decode(pidCryptUtil.toByteArray(key));
var tree = asn.toHexTree();
//setting the public key for encryption
rsa.setPublicKeyFromASN(tree);
var t = new Date(); // timer
crypted = rsa.encrypt(input);
dataToSend.unencrypted = input;
dataToSend.textToDecrypt = pidCryptUtil.fragment(pidCryptUtil.encodeBase64(pidCryptUtil.convertFromHex(crypted)),64);
$('body').append(dataToSend.textToDecrypt);
$.getJSON('engine.php', dataToSend, function(data) {
var items = [];
$.each(data, function(key, val) {
items.push('<li id="' + key + '">' + key + ': ' + val + '</li>');
});
$('<ul/>', {
'class': 'my-new-list',
html: items.join('')
}).appendTo('body');
});
});
});
Это мойкод engine.php, который должен расшифровывать значение.Обратите внимание, что я пробовал несколько разных способов на разных примерах.
<?php
require_once 'private/keys.php';
function EncryptData($source)
{
/*
* NOTE: Here you use the $pub_key value (converted, I guess)
*/
$key = $DEkeys->pubKey;
openssl_public_encrypt($source,$crypttext,$key);
return(base64_encode($crypttext));
}
function DecryptData($source)
{
/*
* NOTE: Here you use the returned resource value
*/
$decoded_source = base64_decode($source);
openssl_private_decrypt($decoded_source,$newsource,$DEkeys->privKey);
return($newsource);
}
function EncryptData2($source)
{
$fp=fopen("/pathtokey/public.pem","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
/*
* NOTE: Here you use the $pub_key value (converted, I guess)
*/
openssl_public_encrypt($source,$crypttext,$pub_key);
return(base64_encode($crypttext));
}
function DecryptData2($source)
{
#print("number : $number");
$fp=fopen("/pathtokey/private.pem","r");
$priv_key=fread($fp,8192);
fclose($fp);
// $passphrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key);
/*
* NOTE: Here you use the returned resource value
*/
$decoded_source = base64_decode($source);
openssl_private_decrypt($decoded_source,$newsource,$res);
return($newsource);
}
$out = new stdClass;
$out->hello = 'hello, world!';
if(!empty($_GET["textToDecrypt"])) {
$out->raw = $_GET['textToDecrypt'];
$out->unencrypted = $_GET['unencrypted'];
if($DEkeys->privKey == false) {
$out->error = 'Could not read private key';
}
$out->success = openssl_private_decrypt(base64_decode($out->raw), $decrypted, $DEkeys->privKey);
$out->decrypted = $decrypted;
$out->dec2 = DecryptData2($out->raw);
$out->test1 = EncryptData2('testing');
$out->test2 = DecryptData2($out->test1);
} else {
$out->nondata = $_GET['textToDecrypt'];
}
echo json_encode($out);
Когда я ввожу «test» для значения для расшифровки, PHP показывает:1015 *
Таким образом, ни функции openssl_private_decrypt (), ни функции DecryptData2 () не будут правильно расшифровывать значения.EncryptData2 () и DecryptData2 () будут работать вместе, хотя.
Возможно ли, что я пропускаю что-то маленькое?Любой совет?
Редактировать: Вот команды, которые я использовал для создания ключей -
Это создает закрытый ключ:
openssl genrsa -out private.pem 1024
Это создает открытый ключ:
openssl rsa -in private.pem -pubout > public.pem