如何在 PHP 中解码 Javascript 中编码的 RSA OAEP
How to decode in PHP RSA OAEP encoded in Javascript
所以,我有一些 encryption/decryption 问题……
感谢 node-forge,我在 javascript 中加密数据,感谢 openssl_private_decrypt,我尝试将其解密为 PHP。
在 PHP 方面,我使用了 «OPENSSL_PKCS1_OAEP_PADDING» 填充。因此,在 javascript 方面,我尝试将 forge 配置为使用 RSA-OAEP 加密数据。
当我尝试解密 PHP 端的消息时,我遇到了这些错误:
error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
error:04065072:rsa routines:rsa_ossl_private_decrypt:padding check failed
我已经尝试为 mgf1 选项配置 sha1 消息摘要和 sha1 加密。我也尝试过没有任何选择(如果我记得的话,默认情况下使用 SHA256)。但是没有办法,我总是有同样的错误......
javascript
const pubkey = `-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
`;
const privkey = `-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
`;
let publicKey = forge.pki.publicKeyFromPem(pubkey);
let key = forge.random.getBytesSync(32);
let encKey = publicKey.encrypt(key, 'RSA-OAEP', {
md: forge.md.sha1.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
let b64Key = encodeURIComponent(btoa(enckey));
接下来,我使用 "xcem" 参数在 url 中发送密钥,感谢 HttpClient。我在 PHP 收到它。
php
$privKey = "";
$b64Key = urldecode($_GET['xcem']);
$encKey = base64_decode($b64Key);
$key = null;
if (!openssl_private_decrypt($encKey, $key, file_get_contents('/keys/openssl_private.key'), OPENSSL_PKCS1_OAEP_PADDING))
{
$errorssl = [];
while ($error = openssl_error_string()) {
$errorssl[] = $error;
}
throw new Exception("Erreur lors du décryptage du message ! " . json_encode($errorssl));
}
当我在 2 个 PHP 服务器之间发送数据时,没有问题…
但是我不能让它在 JS 和 PHP 之间工作......我需要一些帮助 ^^
太…
经过一些测试和头痛,我发现了问题……在我的原始代码中(不是这里的代码)我发送了密钥、初始向量、签名和加密数据……
但是在我的 PHP 中,我试图解码签名……我没有按正确的顺序发送数据……
我的坏…
所以,我有一些 encryption/decryption 问题……
感谢 node-forge,我在 javascript 中加密数据,感谢 openssl_private_decrypt,我尝试将其解密为 PHP。
在 PHP 方面,我使用了 «OPENSSL_PKCS1_OAEP_PADDING» 填充。因此,在 javascript 方面,我尝试将 forge 配置为使用 RSA-OAEP 加密数据。
当我尝试解密 PHP 端的消息时,我遇到了这些错误:
error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error error:04065072:rsa routines:rsa_ossl_private_decrypt:padding check failed
我已经尝试为 mgf1 选项配置 sha1 消息摘要和 sha1 加密。我也尝试过没有任何选择(如果我记得的话,默认情况下使用 SHA256)。但是没有办法,我总是有同样的错误......
javascript
const pubkey = `-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
`;
const privkey = `-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
`;
let publicKey = forge.pki.publicKeyFromPem(pubkey);
let key = forge.random.getBytesSync(32);
let encKey = publicKey.encrypt(key, 'RSA-OAEP', {
md: forge.md.sha1.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
let b64Key = encodeURIComponent(btoa(enckey));
接下来,我使用 "xcem" 参数在 url 中发送密钥,感谢 HttpClient。我在 PHP 收到它。
php
$privKey = "";
$b64Key = urldecode($_GET['xcem']);
$encKey = base64_decode($b64Key);
$key = null;
if (!openssl_private_decrypt($encKey, $key, file_get_contents('/keys/openssl_private.key'), OPENSSL_PKCS1_OAEP_PADDING))
{
$errorssl = [];
while ($error = openssl_error_string()) {
$errorssl[] = $error;
}
throw new Exception("Erreur lors du décryptage du message ! " . json_encode($errorssl));
}
当我在 2 个 PHP 服务器之间发送数据时,没有问题…
但是我不能让它在 JS 和 PHP 之间工作......我需要一些帮助 ^^
太…
经过一些测试和头痛,我发现了问题……在我的原始代码中(不是这里的代码)我发送了密钥、初始向量、签名和加密数据……
但是在我的 PHP 中,我试图解码签名……我没有按正确的顺序发送数据……
我的坏…