Encrypt in Javascript, decrypt in PHP, using public-key cryptography

前端 未结 5 1913
不思量自难忘°
不思量自难忘° 2020-11-30 19:47

I\'d like to encrypt in JavaScript, decrypt in PHP, using public-key cryptography. I\'ve been trying to find libraries that can accomplish this, but am having issues.

<
5条回答
  •  情书的邮戳
    2020-11-30 20:26

    RSA example usage for pidCrypt (js) and phpseclib (php).

    Do not reuse the private key in this working example.

    pidCrypt encryption

    //From the pidCrypt example sandbox
    function certParser(cert) {
        var lines = cert.split('\n');
        var read = false;
        var b64 = false;
        var end = false;
        var flag = '';
        var retObj = {
        };
        retObj.info = '';
        retObj.salt = '';
        retObj.iv;
        retObj.b64 = '';
        retObj.aes = false;
        retObj.mode = '';
        retObj.bits = 0;
        for (var i = 0; i < lines.length; i++) {
            flag = lines[i].substr(0, 9);
            if (i == 1 && flag != 'Proc-Type' && flag.indexOf('M') == 0)//unencrypted cert?
            b64 = true;
            switch (flag) {
                case '-----BEGI':
                    read = true;
                    break;
                case 'Proc-Type':
                    if (read)retObj.info = lines[i];
                    break;
                case 'DEK-Info:':
                    if (read) {
                        var tmp = lines[i].split(',');
                        var dek = tmp[0].split(': ');
                        var aes = dek[1].split('-');
                        retObj.aes = (aes[0] == 'AES') ? true : false;
                        retObj.mode = aes[2];
                        retObj.bits = parseInt(aes[1]);
                        retObj.salt = tmp[1].substr(0, 16);
                        retObj.iv = tmp[1];
                    }
                    break;
                case '':
                    if (read)b64 = true;
                    break;
                case '-----END ':
                    if (read) {
                        b64 = false;
                        read = false;
                    }
                    break;
                    default : if (read && b64)retObj.b64 += pidCryptUtil.stripLineFeeds(lines[i]);
            }
        }
        return retObj;
    }
    
    var strCreditCardPublicKey="-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC\/tI7cw+gnUPK2LqWp50XboJ1i\njrLDn+4\/gPOe+pB5kz4VJX2KWwg9iYMG9UJ1M+AeN33qT7xt9ob2dxgtTh7Mug2S\nn1TLz4donuIzxCmW+SZdU1Y+WNDINds194hWsAVhMC1ClMQTfldUGzQnI5sXvZTF\nJWp\/9jheCNLDRIkAnQIDAQAB\n-----END PUBLIC KEY-----\n";
    
    var objParams=certParser(strCreditCardPublicKey);
    var binaryPrivateKey=pidCryptUtil.decodeBase64(objParams.b64);
    
    var rsa=new pidCrypt.RSA();
    
    var asn=pidCrypt.ASN1.decode(pidCryptUtil.toByteArray(key));
    var tree=asn.toHexTree();
    rsa.setPublicKeyFromASN(tree);
    
    var strHexSensitiveDataEncrypted=rsa.encrypt("4111111111111111");
    
    var strBase64SensitiveDataEncrypted=pidCryptUtil.fragment(pidCryptUtil.encodeBase64(pidCryptUtil.convertFromHex(strHexSensitiveDataEncrypted)), 64))
    
    console.log(strBase64SensitiveDataEncrypted);
    

    .

    phpseclib decryption

    require_once("Crypt/RSA.php");
    
    function decrypt($strBase64CipherText)
    {
        //CRYPT_RSA_MODE_INTERNAL is slow
        //CRYPT_RSA_MODE_OPENSSL is fast, but requires openssl to be installed, configured and accessible.
        define("CRYPT_RSA_MODE", CRYPT_RSA_MODE_INTERNAL);
    
        $rsa=new Crypt_RSA();
    
    
        //$strPrivateKey=file_get_contents("private.pem");
        //This private key is for example purposes
        //DO NOT REUSE
        $strPrivateKey="-----BEGIN RSA PRIVATE KEY-----
            MIICXQIBAAKBgQDBNHK7R2CCYGqljipbPoj3Pwyz4cF4bL5rsm1t8S30gbEbMnKn
            1gpzteoPlKp7qp0TnsgKab13Fo1d+Yy8u3m7JUd/sBrUa9knY6dpreZ9VTNul8Bs
            p2LNnAXOIA5xwT10PU4uoWOo1v/wn8eMeBS7QsDFOzIm+dptHYorB3DOUQIDAQAB
            AoGBAKgwGyxy702v10b1omO55YuupEU3Yq+NopqoQeCyUnoGKIHvgaYfiwu9sdsM
            ZPiwxnqc/7Eo6Zlw1XGYWu61GTrOC8MqJKswJvzZ0LrO3oEb8IYRaPxvuRn3rrUz
            K7WnPJyQ2FPL+/D81NK6SH1eHZjemb1jV9d8uGb7ifvha5j9AkEA+4/dZV+dZebL
            dRKtyHLfbXaUhJcNmM+04hqN1DUhdLAfnFthoiSDw3i1EFixvPSiBfwuWC6h9mtL
            CeKgySaOkwJBAMSdBhn3C8NHhsJA8ihQbsPa6DyeZN+oitiU33HfuggO3SVIBN/7
            HmnuLibqdxpnDOtJT+9A+1D29TkNENlTWgsCQGjVIC8xtFcV4e2s1gz1ihSE2QmU
            JU9sJ3YeGMK5TXLiPpobHsnCK8LW16WzQIZ879RMrkeDT21wcvnwno6U6c8CQQCl
            dsiVvXUmyOE+Rc4F43r0VRwxN9QI7hy7nL5XZUN4WJoAMBX6Maos2Af7NEM78xHK
            SY59+aAHSW6irr5JR351AkBA+o7OZzHIhvJfaZLUSwTPsRhkdE9mx44rEjXoJsaT
            e8DYZKr84Cbm+OSmlApt/4d6M4YA581Os1eC8kopewpy
            -----END RSA PRIVATE KEY-----
        ";
        $strPrivateKey=preg_replace("/[ \t]/", "", $strPrivateKey);//this won't be necessary when loading from PEM
    
    
        $rsa->loadKey($strPrivateKey);
    
        $binaryCiphertext=base64_decode($strBase64CipherText);
    
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
        $strBase64DecryptedData=$rsa->decrypt($binaryCiphertext);
    
        return base64_decode($strBase64DecryptedData);
    }
    
    //The pidCrypt example implementation will output a base64 string of an encrypted base64 string which contains the original data, like this one:
    $strBase64CipherText="JDlK7L/nGodDJodhCj4uMw0/LW329HhO2EvxNXNUuhe+C/PFcJBE7Gp5GWZ835fNekJDbotsUFpLvP187AFAcNEfP7VAH1xLhhlB2a9Uj/z4Hulr4E2EPs6XgvmLBS3MwiHALX2fES5hSKY/sfSUssRH10nBHHO9wBLHw5mRaeg=";
    
    $binaryDecrypted=decrypt($strBase64CipherText);
    
    //should output '4111111111111111'
    var_export($binaryDecrypted);
    

提交回复
热议问题