我一直在努力实现一种加密机制,以便在我的网站上传递安全信息。我的主人收取额外的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显示:- decrypted: dGVzdA== - dec2: dGVzdA==
因此,无论是openssl_private_decrypt()函数还是DecryptData2()函数都不能正确解密这些值。不过,EncryptData2()和DecryptData2()将协同工作。
有没有可能我遗漏了一些小东西?有什么建议吗?
编辑:下面是我用来创建密钥的命令--
这将创建私钥:
openssl genrsa -out private.pem 1024这将创建公钥:
openssl rsa -in private.pem -pubout > public.pem发布于 2012-06-07 05:19:32
试试下面这个简单的例子。我只使用它来加密密码,但您也可以在整个表单中使用它。
它使用开放源码的javascript库https://github.com/ziyan/javascript-rsa。
HTML/JAVASCRIPT:
<script language="JavaScript" type="text/javascript" src="jsbn.js"></script>
<script language="JavaScript" type="text/javascript" src="rsa.js"></script>
<script language="JavaScript">
function encryptData(){
//Don't forget to escape the lines:
var pem="-----BEGIN PUBLIC KEY-----\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfmlc2EgrdhvakQApmLCDOgP0n\
NERInBheMh7J/r5aU8PUAIpGXET/8+kOGI1dSYjoux80AuHvkWp1EeHfMwC/SZ9t\
6rF4sYqV5Lj9t32ELbh2VNbE/7QEVZnXRi5GdhozBZtS1gJHM2/Q+iToyh5dfTaA\
U8bTnLEPMNC1h3qcUQIDAQAB\
-----END PUBLIC KEY-----";
var key = RSA.getPublicKey(pem);
element=document.getElementById('password');
element.value=RSA.encrypt(element.value, key);
}
</script>
<form method='POST' id='txtAuth' onsubmit='encryptData()'>
<input type='text' name='username'/>
<input type='password' name='password' id='password' placeholder="password"/>
<input name='submit' type='submit' value='Submit'>
</form>PHP:
<?php
if (isset($_POST['password'])) {
//Load private key:
$private = "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDfmlc2EgrdhvakQApmLCDOgP0nNERInBheMh7J/r5aU8PUAIpG
XET/8+kOGI1dSYjoux80AuHvkWp1EeHfMwC/SZ9t6rF4sYqV5Lj9t32ELbh2VNbE
/7QEVZnXRi5GdhozBZtS1gJHM2/Q+iToyh5dfTaAU8bTnLEPMNC1h3qcUQIDAQAB
AoGAcbh6UFqewgnpGKIlZ89bpAsANVckv1T8I7QT6qGvyBrABut7Z8t3oEE5r1yX
UPGcOtkoRniM1h276ex9VtoGr09sUn7duoLiEsp8aip7p7SB3X6XXWJ9K733co6C
dpXotfO0zMnv8l3O9h4pHrrBkmWDBEKbUeuE9Zz7uy6mFAECQQDygylLjzX+2rvm
FYd5ejSaLEeK17AiuT29LNPRHWLu6a0zl923299FCyHLasFgbeuLRCW0LMCs2SKE
Y+cIWMSRAkEA7AnzWjby8j8efjvUwIWh/L5YJyWlSgYKlR0zdgKxxUy9+i1MGRkn
m81NLYza4JLvb8/qjUtvw92Zcppxb7E7wQJAIuQWC+X12c30nLzaOfMIIGpgfKxd
jhFivZX2f66frkn2fmbKIorCy7c3TIH2gn4uFmJenlaV/ghbe/q3oa7L0QJAFP19
ipRAXpKGX6tqbAR2N0emBzUt0btfzYrfPKtYq7b7XfgRQFogT5aeOmLARCBM8qCG
tzHyKnTWZH6ff9M/AQJBAIToUPachXPhDyOpDBcBliRNsowZcw4Yln8CnLqgS9H5
Ya8iBJilFm2UlcXfpUOk9bhBTbgFp+Bv6BZ2Alag7pY=
-----END RSA PRIVATE KEY-----";
if (!$privateKey = openssl_pkey_get_private($private)) die('Loading Private Key failed');
//Decrypt
$decrypted_text = "";
if (!openssl_private_decrypt(base64_decode($_POST['password']), $decrypted_text, $privateKey)) die('Failed to decrypt data');
//Decrypted :)
var_dump($decrypted_text);
//Free key
openssl_free_key($privateKey);
}
?>享受吧!
发布于 2012-06-13 15:36:04
您解密的值是base64编码的,因为pidCrypt在加密之前使用base64编码来确保8位字符。所以,简单地使用base64--解码你的结果。
请参阅https://sourceforge.net/projects/pidcrypt/forums/forum/923749/topic/3153476
发布于 2011-10-25 05:19:09
我最终使用了Open ID,虽然不安全,但至少比什么都没有好一点。我找到的具体实现是LightOpenID。
当续费的时候,我会选择一个不同的网络主机,这将允许我以一种负担得起的方式使用SSL。
我从来没有弄清楚为什么我的加密代码不能工作。
https://stackoverflow.com/questions/7247083
复制相似问题