首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载在JSBN中创建的RSA公钥,然后加密消息。

加载在JSBN中创建的RSA公钥,然后加密消息。
EN

Stack Overflow用户
提问于 2015-03-01 08:27:43
回答 2查看 671关注 0票数 1

我试图在JavaScript中使用JSBN创建一个RSA密钥对,并将公钥传输到Crypto++。然后,我试图在Crypto++中加密一条消息,并将其发送回JavaScript并解密。

但是我在这方面还比较新,所以我想我做错了什么(数据没有被解密ofc )。

如能提供任何帮助,将不胜感激:

这是我的cpp代码

代码语言:javascript
复制
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代码

代码语言: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 null

javascript中的dec是来自CPP的retStr。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-01 10:00:58

JSBN使用的PKCS#1 v1.5填充和您的Crypto++代码是一个随机填充,因此,如果您用相同的密钥加密数据,其外观将有所不同。您必须通过在一端加密,在另一端对另一端进行解密来检查您的实现是否工作。

票数 2
EN

Stack Overflow用户

发布于 2015-03-01 19:10:58

代码语言:javascript
复制
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++库的一部分。

然后,执行以下操作:

代码语言:javascript
复制
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加密使用随机填充,因此当您加密消息m1m2时,密码文本是不同的。它被称为“语义安全”,它是强大的(更强大的?)安全概念。这样,坏人就看不出同一条信息是什么时候发出的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28791536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档