【问题标题】:Encrypting in Javascript, decrypting PHP using PKCS#1用 Javascript 加密,用 PKCS#1 解密 PHP
【发布时间】:2012-12-10 19:34:27
【问题描述】:

我尝试使用 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 一起使用的形式?

【问题讨论】:

  • 只是一个建议:也许您也应该通过 ajax 调用在 PHP 中进行加密。这样你就不需要 rsa.js 并且不会有任何问题:)
  • 相关:youtube.com/watch?v=M7kEpw1tn50(不适用于 OP,但任何对 RSA 工作原理感兴趣的人)
  • @povilasp 你的意思是......通过网络发送纯文本数据,未加密,以便可以加密并发送回客户端,以便它可以被“安全地”加密发送到服务器?这条评论是如何获得三张赞成票的?
  • @Ratmil 你为什么在 JavaScript 中做客户端加密?您确定 SSL 不能更好地满足您的需求吗?
  • @meagar,也许他不是在做一个公共应用程序,也许只是某种概念验证代码,安全不是这里的实际问题,你知道,只是说:)但是,如果您使用 SSL,您可以通过网络发送数据而无需担心。

标签: javascript php rsa phpseclib jsbn


【解决方案1】:

对于 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' => new Math_BigInteger('...', 256), 'n' => new 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;
} 

祝你好运!

【讨论】:

    【解决方案2】:

    我猜你已经找到了解决问题的方法,但这里有一个小例子,可以在 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2012-09-09
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多