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

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

问题描述:

I am trying to encrypt some text in JavaScript and then send it to PHP (etc: with Ajax) to decrypt it there and save it (etc: In MySQL).

Here is my code so far:

In JavaScript:

I am using this library for the encryption: 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));

In 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));

Now the answer from PHP is empty every time. Any ideas to make this work?

Thank you for your time!

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

到目前为止,这是我的代码: p>

在JavaScript中 strong> p>

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

  function ConvertToURL(data){
 //将数据转换为URL友好形式
 //等:替换'+','/','=' 使用'plus','slash','equal'
}; 
 
函数AjaxOrder(data){
 //使用Ajax发送PHP中的数据
} 
 
var publicKey ='----- BEGIN PUBLIC  KEY ----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN 
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr / L5i2osbl8C9 + WJTeucF + S76 
xFxdU6jE0NQ + Z + zEdhUTooNRaY5nZiu5PgDB0ED / Z  KBUSLKL7eibMxZtMlUDHjm4 
gwQco1KRMDSmXSMkDwIDAQAB 
 ----- END PUBLIC KEY -----'; 
 
var encrypt = new JSEncrypt(); 
encrypt.setPublicKey(publicKey); 
var encrypted = encrypt.encrypt('Text to 发送。'); 
 
 * //现在我发送带有一些Ajax函数的加密文本* 
 
AjaxOrder(ConvertToURL(加密)); 
  code>  pre> 
 
  

在PHP中: strong> p>

  $ dataPost = $ _POST('dt'); 
 
function ConvertFromURL($ data){
  //将$ data转换为原始形式
 // etc:将'plus','slash','equal'替换为'+','/','='
} 
函数返回数据($ data){\  n //在JavaScript中发送$ data作为Ajax的答案
 
 $ n privateKey ='----- BEGIN RSA私钥----- 
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ 
WMNW649887VGJiGr / L5i2osbl8C9 + WJTeucF + S76xFxdU6jE0NQ +  Z + zEdhUTooNR 
aY5nZiu5PgDB0ED / ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB 
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc / Z2hfenfYEzu + 57fI4fv 
xTQ // 5DbzRR / XKb8ulNv6 + CHyPF31xk7YOBfkGI8qjLoq06V +  FyBfDSwL8KbLyeH 
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN + N9dECQQD0ONYRNZeuM8zd 
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu + cdrQeaqEixrCejXdAF \ NZ / 7 + BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0 / mPwmP5 
rN7QwjrMY + 0 + + AbXcm8mRQyQ1 IGEembsdwJBAN6az8Rv7QnD / YBvi52POIlRSSIM 
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe 
aTgjFnqE / lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil 
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU / YgDnSpJVm1nASoRUnU8Jfm3Oz 
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876 
 ----- END RSA私钥 -----'; 
 
openssl_private_decrypt(ConvertFromURL($ dataPost),$ decryptedWord,$ privateKey); 
 
ReturnData(base64_encode($ decryptedWord)); 
  code>  pre> 
 \  n 

现在PHP的答案每次都是空的。 有什么想法让这个有用吗? p>

感谢您的时间! p> div>

Use HTTPS.

What you are doing will never be able to protect you against active attacks (MitM) since you don't have any trust anchors, and it is very likely that you will make some stupid mistake that will make it insecure.

Either way, you cannot encrypt more than a few hundred bytes directly with RSA. Thus, you will have to securely generate a random symmetric key (doing that properly in JavaScript is not easy), encrypt the data with it using a secure symmetric cipher (e.g. AES) in a secure block cipher mode, then encrypt the symmetric key with RSA. Learning how to do it "properly" will take you much more time than really doing it properly, and that is, configuring SSL.