兼容性rsa.js和rsa.php

问题描述:

我有一个网站,我试图让我的表格安全。我已经做了一些研究,尽管我不是程序员,但我通过自制的质询响应机制来验证用户身份,并使用mcrypt库中的aes加密来加密表单值。迄今为止都很好。除了我的密码需要从客户端发送到服务器...安全。我认为RSA会做到这一点。所以我下载了phpseclib,我已经在服务器端成功加密/解密了。现在,我需要一个客户端代码来加密RSA。我在这里使用这个库http://www.ohdave.com/rsa/。 现在...这是我的问题。兼容性rsa.js和rsa.php

  1. 我使用phpseclib在php中生成一对密钥。
  2. 我提取私有指数,公共指数和模数(公共)。
  3. 我发送公共指数和模数(公共)到JavaScript。

    include('Scripts/phpseclib/Crypt/RSA.php'); 
    require_once('Scripts/phpseclib/Math/BigInteger.php'); 
    
    session_start(); 
    
    $rsa = new Crypt_RSA(); 
    
    extract($rsa->createKey(512)); 
    
    $priv = $rsa->_parseKey($privatekey,CRYPT_RSA_PRIVATE_FORMAT_PKCS1); 
    $privExp = $priv['privateExponent']->toHex(); 
    $pubExp = $priv['publicExponent']->toHex(); 
    $pubMod = $priv['modulus']->toHex(); 
    
    
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
    $_SESSION['privatekey']=$privatekey; 
        $_SESSION['publickey']=$publickey;  
    

的JavaScript产生一个随机数,这将成为,我将进一步用于AES的加密的密码。 JavaScript将使用公共指数和从服务器发送的php的模数(公共),以便在JavaScript中对随机生成的字符串进行加密(这将成为aes-key),并将其发送回php服务器解密。

password = random(); 

key = new RSAKeyPair(
"<?php echo $pubExp; ?>", 
"", 
"<?php echo $pubMod; ?>" 
); 

x = encryptedString(key,password); 
y = decryptedString(key,x); 
document.write(" text cryptat = "+x); 
document.write(" text decryptat = "+y); 

window.location = "rsa.php?text="+x; 
</script>  

PHP服务器将接收加密的字符串和使用私有指数产生从开始就可以解密的AES密钥(由客户端JavaScript随机生成的),从而产生之间的键协议客户端服务器,无需外部干预。

问题:javascript加密随机字符串....但不是PKCS#1 v1.5 ..... phpseclib只接受PKCS#1 v1.5填充,所以php脚本无法正确解密。

请帮助我找到或修改JavaScript,以便向php脚本输出它期望的加密字符串格式PKCS#v 1.5。

+1

你的问题的格式是非常糟糕... – ThiefMaster

+0

为什么你不只是使用SSL? – ceejayoz

+0

我有完全相同的问题,使用jsbn的rsa.js ...没有任何工作,我找不到任何解决方案 –

默认情况下,phpseclib会执行OAEP填充。下面是使JavaScript的互操作性与的演示:

http://www.frostjedi.com/terra/dev/rsa/index.php

这里有一个网站,做PKCS#1填充在javascript:

http://www-cs-students.stanford.edu/~tjw/jsbn/rsa.html

+0

好吧....试着你给我的第二个链接。 – Rivas

+0

>以下是我得到的:>> js encryptedstring = 3d769d784bf0a1cf6234c468ddd9de8442b6a69582d7a797a5e07692d237a07dd699a36cfd2e040e5f09494705188c1ff7b7963f1d739204874d2b9432b9f400; >> JS加密的字符串为bytes = =vxKð||||||||||||||||||||||||||||' >>明文=(无)。 >这里是我使用phpseclib加密的文本:=mŠrOJ#sé®z...£...²Å¼×àôH•VôF¬ü¶j6€ãBäù°¹C¿Eå}¼/XcçÚâœV'ZN£,和Cear文本:cojo 。 >所以它在PHP中工作,但不在2:js和php之间。我要去尝试OAEP,但是我怀疑我会成功。尊重地! – Rivas

+0

你可以发布你使用的私钥和密文的十六进制编码吗? – neubert