encryption - 使用 RSA 技术在 JavaScript 中加密字符串并在 PHP 中解密

标签 encryption cryptography php javascript

我试图在 JavaScript 中加密一些文本,然后将其发送到 PHP(等:使用 Ajax)在那里解密并保存它(等:在 MySQL 中)。

这是迄今为止我的代码:

在 JavaScript 中:

我正在使用这个库进行加密: http://travistidwell.com/blog/2013/02/15/a-better-library-for-javascript-asymmetrical-rsa-encryption/

function ConvertToURL(data) {
    // Converts data to URL friendly form
    // etc: Replaces '+', '/', '=' with 'plus', 'slash', 'equal'
};
function AjaxOrder(data) {
    // Sends data in PHP with Ajax
}

var publicKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----';

var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted = encrypt.encrypt('Text to send.');

*// And now I am sending the encrypted text with some Ajax function*

AjaxOrder(ConvertToURL(encrypted));

在 PHP 中:

$dataPost = $_POST('dt');

function ConvertFromURL($data) {
    // Converts $data to original form
    // etc: Replaces 'plus', 'slash', 'equal' with '+', '/', '='
}
function ReturnData($data) {
    // Sends $data back in JavaScript as an answer to Ajax
}

$privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----';

openssl_private_decrypt(ConvertFromURL($dataPost), $decryptedWord, $privateKey);

ReturnData(base64_encode($decryptedWord));

现在 PHP 的答案每次都是空的。有什么想法可以让这项工作成功吗?

感谢您的宝贵时间!

最佳答案

使用 HTTPS。

您正在做的事情永远无法保护您免受主动攻击 (MitM),因为您没有任何信任 anchor ,并且您非常很可能会犯一些愚蠢的错误会使其不安全。

无论哪种方式,您都无法直接使用 RSA 加密超过几百个字节的数据。因此,您必须安全地生成一个随机对称 key (在 JavaScript 中正确执行此操作并不容易),并在安全分组密码模式下使用安全对称密码(例如 AES)来加密数据,然后用RSA加密对称 key 。学习如何“正确”地做到这一点将比真正正确地做到这一点(即配置 SSL)花费更多的时间。

关于encryption - 使用 RSA 技术在 JavaScript 中加密字符串并在 PHP 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20572107/

相关文章:

encryption - 仅在登录时使用 ssl?或整个网站?

amazon-web-services - 如何使用 Cloud Formation Template 在 S3 存储桶上设置 SSE-S3 或 SSE-KMS 加密?

python - 通过网络发送加密消息时的 Cryptography.fernet.InvalidToken

java - 如何在 PHP 中解密 Bouncy CaSTLe (AES/CBC) 数据?

java - 使用 Java SecureRandom 进行洗牌以实现加密目的?

php - 按固定日期间隔选择并分组

security - 破解 224 位 Blowfish 加密

javax.crypto.BadPaddingException AES 256 CBC 加密

php - 2 位精度 PHP

javascript - 在不破坏内联 Javascript 的情况下缩小 HTML 代码