我有一个C#服务器,它将生成一个RSA KeyValue对。公钥将被发送到PHP客户端,然后将加密一些数据并发送到服务器。然后,服务器将使用它拥有的私钥进行解密。
我在C#中使用以下代码 -
CspParameters cspParams = new CspParameters { ProviderType = 1 };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024, cspParams);
string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
现在我需要将生成的公钥传递给PHP客户端。 但问题是,当我在下面的函数中使用它时,PHP无法识别在C#中生成的Key String -
public function encrypt($data)
{
$pubkey = 'BgIAAACkAABSU0ExAAIAAAEAAQBdZ3klDbVjH8oiBtGzHIMixo/TKPlv492kuau9chnARvkpxaRd8Qa82kIF2AvrEllhzjD07UHkVxoVZA2aYN+t'
$pubKey4 = openssl_get_publickey( $pubkey );
openssl_public_encrypt($data, $encrypted, $pubKey4 )
}
openssl_public_encrypt()
功能显示了这样的警告:
警告:openssl_public_encrypt():key参数不是有效的public 键入C:\ wamp \ www \ rsa \ index.php
请建议,PHP应识别的公钥格式是什么。
X509证书不是一种选择。
答案 0 :(得分:0)
看起来你在PHP中使用$ pubkey的512位密钥?
无论如何,我能够将密钥转换为一个OpenSSH可以使用以下(使用phpseclib):
<?php
include('Crypt/RSA.php');
$a = 'BgIAAACkAABSU0ExAAIAAAEAAQBdZ3klDbVjH8oiBtGzHIMixo/TKPlv492kuau9chnARvkpxaRd8Qa82kIF2AvrEllhzjD07UHkVxoVZA2aYN+t';
$a = base64_decode($a);
echo parseCSBBlob($a);
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa375601(v=vs.85).aspx
function parseCSBBlob($str) {
// from https://msdn.microsoft.com/en-us/library/windows/desktop/aa387453(v=vs.85).aspx
extract(unpack('atype/aversion/vreserved/Valgo', $str));
if (ord($type) != 6) { // 6 == PUBLICKEYBLOB
return false;
}
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx
if ($algo != 0x0000a400) { // 0x0000a400 == CALG_RSA_KEYX
return false;
}
$str = substr($str, 8); // aavV
extract(unpack('Vmagic/Vbitlen/Vpubexp', $str));
if ($magic != 0x31415352) { // RSA1
return false;
}
$str = substr($str, 12); // VVV
if (strlen($str) != $bitlen / 8) {
return false;
}
$str = strrev($str);
$rsa = new Crypt_RSA();
$rsa->loadKey(array(
'e' => new Math_BigInteger($pubexp, 256),
'n' => new Math_BigInteger($str, 256)
));
return $rsa;
}
您也可以使用$rsa
返回的parseCSBBlob
对象执行此操作。
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
define('CRYPT_RSA_PKCS15_COMPAT', true);
$rsa->encrypt($data);