使用 phpseclib 从十六进制编码的 public 密钥进行 RSA 加密
RSA encryption from hex-encoded public key with phpseclib
我正在尝试加密要通过 API 发送的密码以进行身份验证。从 API 我可以得到 public 这种形式的密钥:
{ "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 中的模数和指数正确编码密码?
预计密文是二进制的,而不是十六进制字符串。将其转换为十六进制字符串的常用方法是 bin2hex()
.
当然,这取决于您 API 的期望,但 bin2hex()
是一种典型的做法。
echo bin2hex($ciphertext);
还有反向功能,hex2bin()
。
$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 构造函数的第二个参数。
我想出了解决办法。分为两部分。
使用这两行将十六进制正确编码为二进制:
$modulus = new Math_BigInteger($modulus, 16);
$exponent = new Math_BigInteger($exponent, 16);
然后将结果作为 Nate 所说的十六进制的 bin 输出。
echo bin2hex($ciphertext);
我正在尝试加密要通过 API 发送的密码以进行身份验证。从 API 我可以得到 public 这种形式的密钥:
{ "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 中的模数和指数正确编码密码?
预计密文是二进制的,而不是十六进制字符串。将其转换为十六进制字符串的常用方法是 bin2hex()
.
当然,这取决于您 API 的期望,但 bin2hex()
是一种典型的做法。
echo bin2hex($ciphertext);
还有反向功能,hex2bin()
。
$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 构造函数的第二个参数。
我想出了解决办法。分为两部分。
使用这两行将十六进制正确编码为二进制:
$modulus = new Math_BigInteger($modulus, 16);
$exponent = new Math_BigInteger($exponent, 16);
然后将结果作为 Nate 所说的十六进制的 bin 输出。
echo bin2hex($ciphertext);