質問

I'm trying to use the phpseclib to encrypt/decrypt strings that was encrypted in VB.NET, when I tried to decrypt the RSA XML from VB.NET I get no errors, just a blank page.

Here is the XML keys created from VB.NET:

Private Key:

<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>

Public Key:

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

Plain text: hello

RSA encrypted: [From VB.NET]

d1YJ4ePp80Oe0OBTl+fBAKzDUogC56k7XB8ANggDotm44frzkNYUICUog/BV9x7mQyNT0lHj7vXo0uXrOIAS0BxgCNbqrpw0UBIyCX5rMDZF1v/1eQMTDa3jEwss1DQHHikQWVLFH5IGCspzJUTitwQTAyRCLdYTRijTCQhf0oI=

PHP Code:

<?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);
?>
役に立ちましたか?

解決

Works fine for me:

<?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 has had built-in support for XML keys for a while now so you don't need to jump through all the hoops you did in your code.

The plaintext is h e l l o. Make sure you're running the latest version of phpseclib if you're not already. I don't know of issues with older versions that'd cause problems but running the latest is never a bad idea anyway.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top