如何在python或java中复制JCryption1.1.js加密方法

2024-06-28 19:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在不使用浏览器的情况下对服务器进行身份验证,相反,我想创建一个python脚本来完成这项工作。此服务器使用JCryption 1.1.js,该服务器假定使用明文RSA加密(RSA/ECB/null padding)

$.jCryption.encrypt = function (string, keyPair, callback) {
        var charSum = 0;
        for (var i = 0; i < string.length; i++) {
            charSum += string.charCodeAt(i);
        }
        var tag = '0123456789abcdef';
        var hex = '';
        hex += tag.charAt((charSum & 0xF0) >> 4) + tag.charAt(charSum & 0x0F);

        var taggedString = hex + string;

        var encrypt = [];
        var j = 0;

        while (j < taggedString.length) {
            encrypt[j] = taggedString.charCodeAt(j);
            j++;
        }

        while (encrypt.length % keyPair.chunkSize !== 0) {
            encrypt[j++] = 0;
        }

        function encryption(encryptObject) {
            var charCounter = 0;
            var j, block;
            var encrypted = "";

            function encryptChar() {
                block = new BigInt();
                j = 0;
                for (var k = charCounter; k < charCounter + keyPair.chunkSize; ++j) {
                    block.digits[j] = encryptObject[k++];
                    block.digits[j] += encryptObject[k++] << 8;
                }
                var crypt = keyPair.barrett.powMod(block, keyPair.e);
                var text = keyPair.radix == 16 ? biToHex(crypt) : biToString(crypt, keyPair.radix);
                encrypted += text + " ";
                charCounter += keyPair.chunkSize;
                if (charCounter < encryptObject.length) {
                    setTimeout(encryptChar, 1)
                } else {
                    var encryptedString = encrypted.substring(0, encrypted.length - 1);
                    if ($.isFunction(callback)) {
                        callback(encryptedString);
                    } else {
                        return encryptedString;
                    }

                }
            }

            setTimeout(encryptChar, 1);
        }

        encryption(encrypt);
    };

服务器向我发送模数(n)、指数(e)和最大数字。 这是一个例子:

{"e":"10001","n":"f74ae94f55cc2dcfa92d4f82d1f4816e99b4082d4d459aed0dda228273eceb305021c17ac3d49e76cdc5c0e49038a361c8e465326e5fb6c418ddbf28a407dfd7","maxdigits":"67"}

使用上面的密钥对,如果我提交密码“test”,我会得到以下加密字符串:

"5912c99d8fd7bd26b7e99a1bb80e5b20f540527db7fe4c1e45548226efab376bdf232b975bab346845dcdbf1578387bc03f17261b5947ccc4cf2407c2baa42b0"

我尝试使用pyCrypto对自己的密码和用户名进行加密,但没有得到相同的加密字符串

有人有解决办法吗


Tags: 服务器stringvartagcallbackfunctionblocklength