注意:是的,我知道此消息中有很多代码,但您确实鼓励我们展示先前的研究以及我们一直在尝试的方式。
让我先说一下,我对这个功能的安全性不感兴趣。我想要的只是使用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);
}
嗯,不完全是,我没有拿密码的哈希来获取密钥,因为我已经有了密钥。但是,我仍然不明白什么是无效的。当我们使用这个单独的函数解密我们的密文时,明文是正确的。
对此事项的任何协助将不胜感激。
知道我的运气,它可能只是令人讨厌的东西,就像错误的编码类型一样。