针对长消息的组合RC4 RSA加密/解密Javascript

针对长消息的组合RC4 RSA加密/解密Javascript,javascript,encryption,cryptography,rsa,rc4-cipher,Javascript,Encryption,Cryptography,Rsa,Rc4 Cipher,注意:是的,我知道这条消息中有很多代码,但您确实鼓励我们展示之前的研究以及我们是如何尝试的 让我先说一句,我对这个函数的安全性不感兴趣。我只想用RSA加密和解密任意长的消息。通常,使用分组密码(如AES)对消息进行加密,并使用RSA密码对密钥进行加密。然而,我只是想找到加密/解密长消息的最简单方法,而不考虑安全性。因此,我使用RC4代替分组密码 现在,我可以使用以下代码正确加密: function encryptLong(signedCert, msg) { var key256Bits = C

注意:是的,我知道这条消息中有很多代码,但您确实鼓励我们展示之前的研究以及我们是如何尝试的

让我先说一句,我对这个函数的安全性不感兴趣。我只想用RSA加密和解密任意长的消息。通常,使用分组密码(如AES)对消息进行加密,并使用RSA密码对密钥进行加密。然而,我只是想找到加密/解密长消息的最简单方法,而不考虑安全性。因此,我使用RC4代替分组密码

现在,我可以使用以下代码正确加密:

function encryptLong(signedCert, msg) {
var key256Bits = CryptoJS.SHA256("password");
var ciphertext = CryptoJS.RC4.encrypt(msg, key256Bits);
key = new RSAKey();
var m = CryptoJS.SHA256("password").toString(CryptoJS.enc.Hex);
m = new BigInteger(m, 16);
key.setPublic(signedCert.msg.subject.pk.n, signedCert.msg.subject.pk.e);
var ctxt = key.doPublic(m).toString(16);
var cipherstring = ciphertext + ":" + ctxt;
var obj = { "type": "CTXT-LONG", "encrypted": cipherstring };
return JSON.stringify(obj);
}
消息和密钥已正确加密。我使用这些函数分别测试了它们

function encryptRSA(signedCert, msg) {
//create a new RSA key object
var key = new RSAKey();
//convert ASCII message to hex
var m = asciiToHex(msg);
// create new BigInterger from m
m = new BigInteger(m, 16);
// set the values for the public key
key.setPublic(signedCert.msg.subject.pk.n, signedCert.msg.subject.pk.e);
// compute the RSA public key operation, and convert to a hex value
var ctxt = key.doPublic(m).toString(16);
//enter ctxt into the JSON obj
var obj = { "type": "CTXT-SHORT", "c": ctxt };
return JSON.stringify(obj);
}
而且

function encryptRSA(password, message) {
var key256Bits = CryptoJS.SHA256(password);
var ciphertext = CryptoJS.RC4.encrypt(CryptoJS.enc.Utf8.parse(message), key256Bits);
return ciphertext;
}
现在,这是我们的解密代码:

function decryptLong(sk, ctxt) {
key = new RSAKey();
encryptedStuff = JSON.stringify(ctxt.encrypted);
log(encryptedStuff);
splitEncryptedstuff = encryptedStuff.split(":");
rsaencryption = splitEncryptedstuff[1];
log(rsaencryption);
rc4encryption = splitEncryptedstuff[0];
log(rc4encryption);
c = new BigInteger(rsaencryption, 16);
key.setPrivate(sk.n, sk.e, sk.d);
var key256Bits = key.doPrivate(c).toString(16);
log(key256Bits);
// RC4 decryption
var message = CryptoJS.RC4.decrypt(rc4encryption, key224Bits);
// var ptxt = CryptoJS.enc.Utf8.stringify(message);
// log(ptxt);
return CryptoJS.enc.Utf8.stringify(message);
}
这段代码不能正确解密,但我知道它的一部分可以工作。例如,我在哪里

log(key356Bits);
它精确地返回密钥。所以我知道至少RSA解密是有效的。我不明白的是,我完全遵循了我拥有的解密函数。具体如下

function decryptRC4(password, ciphertext) {
var key256Bits = CryptoJS.SHA256(password);
var message = CryptoJS.RC4.decrypt(ciphertext, key256Bits);
return CryptoJS.enc.Utf8.stringify(message);
}
不完全是这样,我不需要对密码进行哈希运算就可以得到密钥,因为我已经有了密钥。但是,我仍然不明白什么是不起作用的。当我们使用这个单独的函数解密密文时,明文是正确的

在此问题上的任何协助都将不胜感激


知道我的运气,它可能只是一些恼人的东西,就像它在错误的编码类型的事情

不应该是“var message=CryptoJS.RC4.decrypt(rc4encryption,key224Bits);”是“var message=CryptoJS.RC4.decrypt(rc4encryption,key256Bits);”?(OT btw:RC4是蒸汽密码,无阻塞密码)啊,好的,我明白你指的是什么。我想现在没关系了。我稍微改变了一下我的方法,然后我提交了。是的,我知道RC4是一种流密码,我最初尝试过使用AES,这是一个巨大的痛苦,所以我使用了我以前做过的更简单的密码,只是为了让它工作。然后我累了,把RC4放在那里。很可能是编码。您应该更加小心地编写代码;创建较小的方法,显式定义输入输出(包括编码)并单独测试它们。然后将结果合并。目前,您似乎在这条语句中混合了文本和二进制:
var-cipherstring=ciphertext+“:”+ctxt。这不可能是正确的,并可能导致一个答案。