为了账号安全,请及时绑定邮箱和手机立即绑定

请问能否提供一个使用jsencrypt的js公钥解密例子?

/ 猿问

请问能否提供一个使用jsencrypt的js公钥解密例子?

蓝山帝景 2018-08-09 11:07:06

网上的都是js公钥加密例子,解密的例子就不好找。

自己写尝试过很多次还是不行,希望帮助


查看完整描述

5 回答

?
慕前端4074691

jsencrypt没有公钥解密,只能前端公钥加密后台私钥解密。如果想要实现双向加密,就要使用两套密钥。前台向后端发送数据时,使用第一套公钥加密,后台用第一套私钥解密。后台向前台发送数据时,后台使用第二套公钥加密,前台使用第二套私钥解密。


查看完整回答
1 反对 回复 2019-01-27
  • 幕布斯6125053
    幕布斯6125053
    1、 RSADecrypt //var a = this.doPrivate(d); var a = this.doPublic(d); 2、pkcs1unpad2 //return null 就实现了js就可以使用公钥解密,java端私钥加密的文本
?
幕布斯6125053

1、 RSADecrypt //var a = this.doPrivate(d); var a = this.doPublic(d); 

2、pkcs1unpad2 //return null 

就实现了js就可以使用公钥解密,java端私钥加密的文本

查看完整回答
反对 回复 2019-11-03
?
qq_沐晓清枫_0

楼主你好,你的公钥解密的问题解决了吗?现在我也和你遇到同样的问题,希望得到帮助,谢谢!

查看完整回答
反对 回复 2019-09-03
?
Long_baby

你的这个问题解决了吗

查看完整回答
反对 回复 2018-11-16
?
富国沪深

最近捣鼓了一下js RSA前端加解密。是通过用jsencrypt.min.js来实现的,这个js本身自带了RSA公钥加密和RSA私钥解密。对一些短字符串加解密足够。但如果加密的和解密的内容比较长的时候,就会有问题。所以要进行分段加解密,参考了网上的一些例子。多少有点问题。所以自己捣鼓了一下。直接看看代码吧
需要注意一个问题:如果与JAVA后台数据交互,加密内容又特别长,比如好几千上万个字符。某些中文字符可能因为编码原因会乱码(少数)。英文字符完美。一般不影响正常业务使用。
先看看添加的方法吧。

 

1、添加两个转换函数

 

// Convert a hex string to a byte array

    function hexToBytes(hex) {

        for (var bytes = [], c = 0; c < hex.length; c += 2)

            bytes.push(parseInt(hex.substr(c, 2), 16));

        return bytes;

    }

 

// Convert a byte array to a hex string

    function bytesToHex(bytes) {

        for (var hex = [], i = 0; i < bytes.length; i++) {

            hex.push((bytes[i] >>> 4).toString(16));

            hex.push((bytes[i] & 0xF).toString(16));

        }

        return hex.join("");

    }

2、添加分段加解密函数(分段解密有两个方法,建议用第二个)

 

 JSEncrypt.prototype.encryptLong2 = function (string) {

            var k = this.getKey();

            try {

                var lt = "";

                var ct = "";

                //RSA每次加密117bytes,需要辅助方法判断字符串截取位置

                //1.获取字符串截取点

                var bytes = new Array();

                bytes.push(0);

                var byteNo = 0;

                var len, c;

                len = string.length;

                var temp = 0;

                for (var i = 0; i < len; i++) {

                    c = string.charCodeAt(i);

                    if (c >= 0x010000 && c <= 0x10FFFF) {

                        byteNo += 4;

                    } else if (c >= 0x000800 && c <= 0x00FFFF) {

                        byteNo += 3;

                    } else if (c >= 0x000080 && c <= 0x0007FF) {

                        byteNo += 2;

                    } else {

                        byteNo += 1;

                    }

                    if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) {

                        if (byteNo - temp >= 114) {

                            bytes.push(i);

                            temp = byteNo;

                        }

                    }

                }

                //2.截取字符串并分段加密

                if (bytes.length > 1) {

                    for (var i = 0; i < bytes.length - 1; i++) {

                        var str;

                        if (i == 0) {

                            str = string.substring(0, bytes[i + 1] + 1);

                        } else {

                            str = string.substring(bytes[i] + 1, bytes[i + 1] + 1);

                        }

                        var t1 = k.encrypt(str);

                        ct += t1;

                    }

                    ;

                    if (bytes[bytes.length - 1] != string.length - 1) {

                        var lastStr = string.substring(bytes[bytes.length - 1] + 1);

                        ct += k.encrypt(lastStr);

                    }

                    return hex2b64(ct);

                }

                var t = k.encrypt(string);

                var y = hex2b64(t);

                return y;

            } catch (ex) {

                return false;

            }

        };

 

 

        JSEncrypt.prototype.decryptLong = function (string) {

            var k = this.getKey();

            var maxLength = ((k.n.bitLength() + 7) >> 3);

            //var maxLength = 128;

            try {

 

                var str = b64tohex(string);

                //var b=hex2Bytes(str);

 

                var inputLen = str.length;

 

                var ct = "";

                if (str.length > maxLength) {

 

                    var lt = str.match(/.{1,256}/g);

                    lt.forEach(function (entry) {

                        var t1 = k.decrypt(entry);

                        ct += t1;

                    });

                    return ct;

                }

                var y = k.decrypt(b64tohex(string));

                return y;

            } catch (ex) {

                return false;

            }

        };

 

 

        JSEncrypt.prototype.decryptLong2 = function (string) {

            var k = this.getKey();

            // var maxLength = ((k.n.bitLength()+7)>>3);

            var MAX_DECRYPT_BLOCK = 128;

            try {

                var ct = "";

                var t1;

                var bufTmp;

                var hexTmp;

                var str = b64tohex(string);

                var buf = hexToBytes(str);

                var inputLen = buf.length;

                //开始长度

                var offSet = 0;

                //结束长度

                var endOffSet = MAX_DECRYPT_BLOCK;

 

                //分段加密

                while (inputLen - offSet > 0) {

                    if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

                        bufTmp = buf.slice(offSet, endOffSet);

                        hexTmp = bytesToHex(bufTmp);

                        t1 = k.decrypt(hexTmp);

                        ct += t1;

                        

                    } else {

                        bufTmp = buf.slice(offSet, inputLen);

                        hexTmp = bytesToHex(bufTmp);

                        t1 = k.decrypt(hexTmp);

                        ct += t1;

                     

                    }

                    offSet += MAX_DECRYPT_BLOCK;

                    endOffSet += MAX_DECRYPT_BLOCK;

                }

                return ct;

            } catch (ex) {

                return false;

            }

        };

3用法:

 

        //实例化加密对象

        var encrypt = new JSEncrypt();

        //设置加密公钥

        encrypt.setPublicKey("......");

 

        //分段加密

        var sss=encrypt.encryptLong("这几天心里颇不宁静。今晚在院子里坐着乘凉,忽然想起日日走过的荷塘,");

        alert(sss);

        //密文

       var ttt="..........................";

        //设置解密私钥

        encrypt.setPrivateKey(".......")

        //分段解密

        var sss= encrypt.decryptLong2(sss);


查看完整回答
反对 回复 2018-08-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信