第一次问一个问题所以请温柔: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