代码之家  ›  专栏  ›  技术社区  ›  The Newbie

解密从VB.NET创建的RSA[XML]

  •  0
  • The Newbie  · 技术社区  · 12 年前

    我正在尝试使用phpseclib来加密/解密在VB.NET中加密的字符串,当我尝试从VB.NET解密RSA XML时,我没有收到任何错误,只是一个空白页面。

    以下是从VB.NET创建的XML键:

    私钥:

    <RSAKeyValue><Modulus>qfOIjoSxsmBqS3YGsxd4+FBEmFmX4Z/cTAV4l3BOqmMVDxTxHt4QuvK8l2Iv6GeTSp5xuwpqUkgwyo4zb2UQt1sLn2vvAmGqz7Oih6gHYrpA9GmR6QHomsQNJrDTvZXtCPNUmWZ5DzFjnKNL/FfZQGYp0qjIkpIhuLAUhKYzMaM=</Modulus><Exponent>AQAB</Exponent><P>57hBPSAr6VGVYTYL6pUft0y9hbU7cUYEiYhF2pVJ0pv6pGWIb27nK+9U/AaWH0+wtefpRlVyjbeNiDK3rmYmtQ==</P><Q>u8Jgam1//jhcYYCZX5168L0roe6L+IJ0A98zlbQb7crpqbTxqDAsX9LQpGiQP1JZINowAbPECDRZIGfT+fsV9w==</Q><DP>AZASkJD4+tfcBA3TQr/CuP/Bf3dbcUYhnbPXlMPQ/aSjqhwtMWM0F+3DSvfYZ1moPXHU9u54mVAVmkeNSZXSyQ==</DP><DQ>J1DFVaPGKFpu5a/C7eWQ57YE2+ySfJ/8YQ8sww0qx/k0Qmf0Li6gLBR9wd9vTQMWTK3DXafhxYIIo6N6HJ858w==</DQ><InverseQ>Q2MlSoE2ADtFXvjPi5UgxApqp4QewmZONu3vGmAL07JMyDHdgVweevZTJTun3EBRKV0PWCMvtk4BJW0lUSuBNQ==</InverseQ><D>TCzzVWYWu+xJWJ+DazynJS3dQShPUnsz5ANDxSU6rVaR9tudJAfHGfR5IaWJ8bKTK4wPUBXgCBeBfxjz5wc20SyBWa1vL7K4DqLRJ/qEyFSZxXr8wKQOKyexZRGbsLjtUnmYrrXKMOhRkiV/VI1K+TKX/FhoDVPjz8s4GamzNQk=</D></RSAKeyValue>
    

    公钥:

    <RSAKeyValue><Modulus>qfOIjoSxsmBqS3YGsxd4+FBEmFmX4Z/cTAV4l3BOqmMVDxTxHt4QuvK8l2Iv6GeTSp5xuwpqUkgwyo4zb2UQt1sLn2vvAmGqz7Oih6gHYrpA9GmR6QHomsQNJrDTvZXtCPNUmWZ5DzFjnKNL/FfZQGYp0qjIkpIhuLAUhKYzMaM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
    

    纯文本: 你好

    RSA加密:[来自VB.NET]

    d1YJ4ePp80Oe0OBTl+fBAKzDUogC56k7XB8ANggDotm44frzkNYUICUog/BV9x7mQyNT0lHj7vXo0uXrOIAS0BxgCNbqrpw0UBIyCX5rMDZF1v/1eQMTDa3jEwss1DQHHikQWVLFH5IGCspzJUTitwQTAyRCLdYTRijTCQhf0oI=
    

    PHP代码:

    <?php
    include('Crypt/RSA.php');
    
    $publickey = '...';
    
    $xml = new DOMDocument();
    $xml->loadXML($publickey);
    
    $modulus = new Math_BigInteger(base64_decode($xml->getElementsByTagName('Modulus')->item(0)->nodeValue), 256);
    $exponent = new Math_BigInteger(base64_decode($xml->getElementsByTagName('Exponent')->item(0)->nodeValue), 256);
    
    $privatekey = '...';
    
    $xml = new DOMDocument();
    $xml->loadXML($privatekey);
    
    $d = new Math_BigInteger(base64_decode($xml->getElementsByTagName('D')->item(0)->nodeValue), 256);
    $dp = new Math_BigInteger(base64_decode($xml->getElementsByTagName('DP')->item(0)->nodeValue), 256);
    $dq = new Math_BigInteger(base64_decode($xml->getElementsByTagName('DQ')->item(0)->nodeValue), 256);
    $inverseq = new Math_BigInteger(base64_decode($xml->getElementsByTagName('InverseQ')->item(0)->nodeValue), 256);
    $p = new Math_BigInteger(base64_decode($xml->getElementsByTagName('P')->item(0)->nodeValue), 256);
    $q = new Math_BigInteger(base64_decode($xml->getElementsByTagName('Q')->item(0)->nodeValue), 256);
    
    $rsa = new Crypt_RSA();
    $rsa->modulus = $modulus;
    $rsa->publicExponent = $exponent;
    $rsa->exponents = array(1=> $dp, $dq);
    $rsa->coefficients = array(2 => $inverseq);
    $rsa->primes = array(1 => $p, $q);
    $rsa->k = strlen($rsa->modulus->toBytes());
    
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    
    $ciphertext = base64_decode('d1YJ4ePp80Oe0OBTl+fBAKzDUogC56k7XB8ANggDotm44frzkNYUICUog/BV9x7mQyNT0lHj7vXo0uXrOIAS0BxgCNbqrpw0UBIyCX5rMDZF1v/1eQMTDa3jEwss1DQHHikQWVLFH5IGCspzJUTitwQTAyRCLdYTRijTCQhf0oI=');
    echo $rsa->decrypt($ciphertext);
    ?>
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   neubert    12 年前

    对我来说很好:

    <?php
    include('Crypt/RSA.php');
    
    $rsa = new Crypt_RSA();
    $rsa->loadKey('<RSAKeyValue><Modulus>qfOIjoSxsmBqS3YGsxd4+FBEmFmX4Z/cTAV4l3BOqmMVDxTxHt4QuvK8l2Iv6GeTSp5xuwpqUkgwyo4zb2UQt1sLn2vvAmGqz7Oih6gHYrpA9GmR6QHomsQNJrDTvZXtCPNUmWZ5DzFjnKNL/FfZQGYp0qjIkpIhuLAUhKYzMaM=</Modulus><Exponent>AQAB</Exponent><P>57hBPSAr6VGVYTYL6pUft0y9hbU7cUYEiYhF2pVJ0pv6pGWIb27nK+9U/AaWH0+wtefpRlVyjbeNiDK3rmYmtQ==</P><Q>u8Jgam1//jhcYYCZX5168L0roe6L+IJ0A98zlbQb7crpqbTxqDAsX9LQpGiQP1JZINowAbPECDRZIGfT+fsV9w==</Q><DP>AZASkJD4+tfcBA3TQr/CuP/Bf3dbcUYhnbPXlMPQ/aSjqhwtMWM0F+3DSvfYZ1moPXHU9u54mVAVmkeNSZXSyQ==</DP><DQ>J1DFVaPGKFpu5a/C7eWQ57YE2+ySfJ/8YQ8sww0qx/k0Qmf0Li6gLBR9wd9vTQMWTK3DXafhxYIIo6N6HJ858w==</DQ><InverseQ>Q2MlSoE2ADtFXvjPi5UgxApqp4QewmZONu3vGmAL07JMyDHdgVweevZTJTun3EBRKV0PWCMvtk4BJW0lUSuBNQ==</InverseQ><D>TCzzVWYWu+xJWJ+DazynJS3dQShPUnsz5ANDxSU6rVaR9tudJAfHGfR5IaWJ8bKTK4wPUBXgCBeBfxjz5wc20SyBWa1vL7K4DqLRJ/qEyFSZxXr8wKQOKyexZRGbsLjtUnmYrrXKMOhRkiV/VI1K+TKX/FhoDVPjz8s4GamzNQk=</D></RSAKeyValue>');
    
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    
    echo $rsa->decrypt(base64_decode('d1YJ4ePp80Oe0OBTl+fBAKzDUogC56k7XB8ANggDotm44frzkNYUICUog/BV9x7mQyNT0lHj7vXo0uXrOIAS0BxgCNbqrpw0UBIyCX5rMDZF1v/1eQMTDa3jEwss1DQHHikQWVLFH5IGCspzJUTitwQTAyRCLdYTRijTCQhf0oI='));
    

    phpseclib已经内置了对XML键的支持一段时间了,所以您不需要跳过代码中的所有步骤。

    明文为 h e l l o 。如果尚未运行最新版本的phpseclib,请确保您正在运行。我不知道旧版本的问题会导致问题,但运行最新版本绝对不是一个坏主意。