我尝试使用PKCS#1在Javascript / PHP中进行加密/解密。 我有以下变量:
e: Public exponent (for encryption)
d: Private exponent (for decryption)
n: modulus
我正在使用这个javascript库来解密: http://www-cs-students.stanford.edu/~tjw/jsbn/rsa.js 像这样:
var rsa = new RSAKey();
rsa.setPublic(n, e);
var cipherText = rsa.encrypt(plainText);
要在PHP中解密我使用PHPSec库:
问题1:如何将d和n转换为在phpseclib中使用的私钥?
问题2:如何将Javascript代码的输出转换为可与phpseclib一起使用的表单?
答案 0 :(得分:0)
对于javascript / PHP互操作性,请查看:
http://area51.phpbb.com/phpBB/viewtopic.php?f=84&t=33024&start=0
PKCS#1 v2.1 RSAES-OAEP(它应该提供比PKCS#1 v2.1 RSASSA-PKCS1-v1_5更好的安全性)。
$ rsa-> LOADKEY( 阵列( 'e'=>新的Math_BigInteger('...',256), 'n'=>新的Math_BigInteger('...',256) ) );
如果这不起作用,请告诉我。
或者,你可以试试这个:
http://www.frostjedi.com/phpbb3/viewtopic.php?p=331621#p331621
(见第二个代码块)
为了将js输出转换为PHP可以使用的格式...我链接到的概念证明是将输出传递给char2hex():
function char2hex(source)
{
var hex = "";
for (var i = 0; i < source.length; i+=1)
{
temp = source[i].toString(16);
switch (temp.length)
{
case 1:
temp = "0" + temp;
break;
case 0:
temp = "00";
}
hex+= temp;
}
return hex;
}
祝你好运!
答案 1 :(得分:0)
我想你已经找到了解决问题的方法,但是对于那些仍在寻找解决方案的人来说,在Javascript和PHP之间使用RSA是一个小问题(例如):
<?php
$path = 'phpseclib';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
include_once('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_RAW);
$key = $rsa->createKey(512);
$e = new Math_BigInteger($key['publickey']['e'], 10);
$e = $e->toHex();
$n = new Math_BigInteger($key['publickey']['n'], 10);
$n = $n->toHex();
function decrypt($msg, $key) {
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
$s = new Math_BigInteger($msg, 16);
return $rsa->decrypt($s->toBytes());
}
?>
<script type="text/javascript" src="javascript/jsbn.js"></script>
<script type="text/javascript" src="javascript/prng4.js"></script>
<script type="text/javascript" src="javascript/rng.js"></script>
<script type="text/javascript" src="javascript/rsa.js"></script>
<script>
<?php
echo "var n='".$n."';";
echo "var e='".$e."';";
?>
function encrypt() {
var rsa = new RSAKey();
rsa.setPublic(n, e);
document.getElementById('enc_text').value = rsa.encrypt(document.getElementById('plaintext').value);
}
</script>
Plain Text:<br/>
<input id='plaintext' name='plaintext' type="text" size="40"/><br/>
<input type="button" onclick="encrypt()" value="Encrypt"/><br/>
Encrypted Text:<br/>
<form action="" method="post">
<input id="enc_text" name='enc_text' type="text" size="40"/><br/>
<?php
echo '<input id="key" name="key" type="hidden" size="40" value="'.urlencode($key['privatekey']).'"/><br/>';
?>
<input name="submit" type="submit" value="Submit" size="10"/>
</form>
<?php
if(isset($_POST['submit']) && ($_POST['enc_text'] != 0)) {
echo decrypt($_POST['enc_text'], urldecode($_POST['key']));
}
?>
如果您需要更多示例,请访问官方网站获取文档: http://phpseclib.sourceforge.net/new/rsa/examples.html
或
http://bestmike007.com/2011/08/secure-data-transmission-between-pure-php-and-javascript-using-rsa/