恢复使用RSA加密的消息,大于模数

时间:2014-02-03 18:30:22

标签: encryption cryptography

第一次问一个问题所以请温柔:D。这个项目与在python中使用javascript进行加密和解密相关,但从本质上讲,我认为这个问题与语言无关。

我编写了一个程序,使用RSA加密将消息从客户端发送到服务器。我现在知道我应该使用RSA加密来传递对称加密密钥,但是考虑到我现在的情况,我想知道......

如果我使用RSA加密一条长于模数n的消息,有没有办法恢复该消息?我问,因为客户端已经分发,我收到一些消息,如果可能的话我会手工解密。我认为,因为在加密中我提高了m ^ e(mod n),所以解密后得到的字符串... m',将等于m mod n:m'= m(mod n),但是这个似乎并非如此。

这是我在客户端用于加密的代码。我使用20位数的随机字符填充,用SHA256进行散列。

   // FUNCTIONS FOR LOGIN ENCRYPTION

function encryptString(s){

    var keys = require('main_windows/keys').getKeys();

    var hash = CryptoJS.SHA256(randomString(20));

    var num_string = stringToBigInt(s + hash);

    return num_string.modPow(BigInteger(keys.keyE), BigInteger(keys.keyN)).toString();
}

function stringToBigInt(s) {
    var numeric = "";
    for (var i = 0; i < s.length; i++) {
        c = s.charCodeAt(i);
        if (c < 10)
            c = "00" + c;
        else if (c < 100)
            c = "0" + c;
        numeric = numeric + c;
    }
    return BigInteger.parse(numeric, 10);
}

function randomString(len) {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < len; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

这是服务器上的解密代码......

def decrypt(string, d, n):
    de_string = pow(long(string), d, n)
    numIn = str(de_string)
    digits = int(math.log10(de_string))+1

    pad = 3
    if digits % 3 != 0:
        pad = digits % 3
    i = pad

    output = str(chr(int(numIn[0:i])))
    while i < len(numIn) - 3*64:
        output += str(chr(int(numIn[i:i+3])))
        i += 3
    return output

我正在尝试这样的事情来检查我是否能找到真实的信息......

def decrypt_too_big(string, d, n):
    real_string = pow(long(string), d, n)

    attempts = 0
    result = "failed"
    while result == "failed" and attempts < 10000:
        try:
            de_string = real_string + (attempts * (n))

            numIn = str(de_string)
            digits = int(math.log10(de_string))+1

            pad = 3
            if digits % 3 != 0:
                pad = digits % 3
            i = pad

            output = str(chr(int(numIn[0:i])))
            while i < len(numIn) - 3*64:
                output += str(chr(int(numIn[i:i+3])))
                i += 3
            result = output
        except:
            pass
        attempts += 1
    return result

0 个答案:

没有答案