我试图在JavaScript中使用JSBN创建一个RSA密钥对,并将公钥传输到Crypto++。然后,我试图在Crypto++中加密一条消息,并将其发送回JavaScript并解密。
但是我在这方面还比较新,所以我想我做错了什么(数据没有被解密ofc )。
如能提供任何帮助,将不胜感激:
这是我的cpp代码
Integer n(nStr->c_str()),
e("0x10001");
RSA::PublicKey pubKey;
pubKey.Initialize(n, e);
AutoSeededRandomPool rng;
if (!pubKey.Validate(rng, 3))
throw std::exception("Rsa private key validation failed");
////////////////////////////////////////////////
// Encryption
RSAES_PKCS1v15_Encryptor enc(pubKey);
StringSource ss1(data, true,
new PK_EncryptorFilter(rng, enc,
new StringSink(retStr)
));
std::string retData2 = "";
StringSource ss2((const byte*)retStr.data(), retStr.size(), true,
new Base64Encoder(
new StringSink(retData2)
));
retStr = retData2;和我的javascript代码
// nStr in CPP is "0x" + localStorage.getItem("rsa_public") from javascript
// data in CPP is "secret"
var rsa = new RSAKey();
var publickey = localStorage.getItem("rsa_public");
var privatekey = localStorage.getItem("rsa_private");
rsa.setPrivate(publickey, "10001", privatekey);
alert(b64tohex(dec) + "\n" + rsa.encrypt("secret")); <-- these don't match at all .. and ofc rsa.decrypt returns nulljavascript中的dec是来自CPP的retStr。
发布于 2015-03-01 10:00:58
JSBN使用的PKCS#1 v1.5填充和您的Crypto++代码是一个随机填充,因此,如果您用相同的密钥加密数据,其外观将有所不同。您必须通过在一端加密,在另一端对另一端进行解密来检查您的实现是否工作。
发布于 2015-03-01 19:10:58
RSAES_PKCS1v15_Encryptor enc(pubKey);
StringSource ss1(data, true,
new PK_EncryptorFilter(rng, enc,
new StringSink(retStr)
));
...
StringSource ss2((const byte*)retStr.data(), retStr.size(), true,
new Base64Encoder(
new StringSink(retData2)
));我不确定这对于与Javascript和JSBN的互操作是否正确。它是正确的独立,它是正确的互操作与OpenSSL‘。
Crypto++使用早期的Base64编码方案。它出现在电子邮件和当时的其他标准中(当时大约在20世纪90年代左右)。字母表使用加号(+)和正斜杠(/)字符。
Javascript和JSON技术(如JSON (JWKs) )倾向于使用Base64或Web安全字母表进行编码。字母表使用减号(-)和下划线(_)字符。
新旧Base64编码方案都是在RFC 4648、Base16、Base32和Base64数据编码中指定的。
您应该获取Base64URLEncoder的修补程序,并将其应用于Crypto++源代码的顶部。修补之后,您将拥有现有的Base6Encoder和新的Base64URLEncoder。最后,重新编译并重新安装库。你必须修补它,因为它不是魏代所写和提供的Crypto++库的一部分。
然后,执行以下操作:
RSAES_PKCS1v15_Encryptor enc(pubKey);
string encoded;
StringSource ss(data, true,
new PK_EncryptorFilter(prng, enc,
new Base64URLEncoder(
new StringSink(encoded)
)));
// Print encoded cipher text
cout << encoded << endl;
return encoded;至于“这些根本不匹配.”-我想这是意料之中的。RSA加密使用随机填充,因此当您加密消息m1和m2时,密码文本是不同的。它被称为“语义安全”,它是强大的(更强大的?)安全概念。这样,坏人就看不出同一条信息是什么时候发出的。
https://stackoverflow.com/questions/28791536
复制相似问题