使用带有phpseclib

时间:2015-10-12 23:11:31

标签: php encryption rsa phpseclib

我正在尝试加密密码以通过API进行身份验证。从API我可以获得这种形式的公钥:

 {   "result": {
 "keyId": "L5gslEaP921gEI34N5JRVRIEbbx78WJN",
 "key": {
   "n": "871db29fbb487b988f2d610d83a1e699c59473d73f6d38efa8d21645524b5fb549d5ffbc6d527b261ff2291cf3b3c81f25a4cb13c801d6f6eb3cae624d74724830f1cb45ec803d8836274f1ddea61ec25d5c44ad7ed0b8a56976291bd06abaa0beb9e1ecbbc59662d20f8ae71191e8cbe617acee2349a64aa20846d4d8910e53",
   "e": "10001"
 }   } }

我需要加密用户密码并将其发送回API。我使用PHP,这是我到目前为止,但我没有得到一个正确的十六进制加密密码发回:

$modulus = "871db29fbb487b988f2d610d83a1e699c59473d73f6d38efa8d21645524b5fb549d5ffbc6d527b261ff2291cf3b3c81f25a4cb13c801d6f6eb3cae624d74724830f1cb45ec803d8836274f1ddea61ec25d5c44ad7ed0b8a56976291bd06abaa0beb9e1ecbbc59662d20f8ae71191e8cbe617acee2349a64aa20846d4d8910e53";
$exponent = "10001";
$plaintext = "********";

include('Crypt/RSA.php');

$rsa = new Crypt_RSA();

$modulus = new Math_BigInteger(base64_decode($modulus), 256);
$exponent = new Math_BigInteger(base64_decode($exponent), 256);

$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));


$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($plaintext);

echo $ciphertext;

如何根据API中的模数和指数正确编码密码?

3 个答案:

答案 0 :(得分:1)

预计密文是二进制的,而不是十六进制的字符串。将其转换为十六进制字符串的常用方法是bin2hex()

当然,这取决于您的API预期,但add $a0,$a0,1将是一种典型的方式。

^A

还有反向功能,hex2bin()

答案 1 :(得分:1)

$modulus = "871db29fbb487b988f2d610d83a1e699c59473d73f6d38efa8d21645524b5fb549d5ffbc6d527b261ff2291cf3b3c81f25a4cb13c801d6f6eb3cae624d74724830f1cb45ec803d8836274f1ddea61ec25d5c44ad7ed0b8a56976291bd06abaa0beb9e1ecbbc59662d20f8ae71191e8cbe617acee2349a64aa20846d4d8910e53";
$exponent = "10001";

那不是base64编码的。这是十六进制编码的。 10001 == 65537。尝试加载你的密钥:

$modulus = new Math_BigInteger(base64_decode($modulus), 16);
$exponent = new Math_BigInteger(base64_decode($exponent), 16);

例如。使用16而不是256作为Math_BigInteger构造函数的第二个参数。

答案 2 :(得分:0)

我找到了解决方案。它分为两部分。

使用以下两行正确编码十六进制到二进制文件:

$modulus = new Math_BigInteger($modulus, 16);
$exponent = new Math_BigInteger($exponent, 16);

并且如Nate所述,将结果作为bin放入十六进制。

echo bin2hex($ciphertext);