2

注意:是的,我知道此消息中有很多代码,但您确实鼓励我们展示之前的研究以及我们一直在尝试的方式。

让我先说一下,我对这个功能的安全性不感兴趣。我想要的只是使用 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);
}

不完全是,我不必使用密码的哈希来获取密钥,因为我已经有了密钥。但是,我仍然不明白什么不起作用。当我们使用这个单独的函数解密我们的密文时,明文是正确的。

在此问题上的任何帮助将不胜感激。

知道我的运气,这可能只是令人讨厌的事情,就像它在错误的编码类型中一样。

4

0 回答 0