Я работал над попыткой реализовать механизм шифрования для передачи защищенной информации на моем сайте. Мой хозяин взимает дополнительную плату за 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);
Когда я ввожу «тест» для значения для дешифрования, PHP показывает: – расшифрованный: dGVzdA == – dec2: dGVzdA ==
Таким образом, ни функции openssl_private_decrypt (), ни функции DecryptData2 () не будут правильно расшифровывать значения. EncryptData2 () и DecryptData2 () будут работать вместе.
Возможно ли, что у меня что-то малое? Любой совет?
Edit: Вот команды, которые я использовал для создания ключей –
Это создает закрытый ключ:
openssl genrsa -out private.pem 1024
Это создает открытый ключ:
openssl rsa -in private.pem -pubout > public.pem