0

已解决(寻找我的答案)。我需要帮助在 C++ 中使用 RSA 加密密码。我正在为 C++ 中的 Blackberry10 工作,我一直在寻找 RSA 教程或指导我完成加密过程的东西,但遗憾的是我没有找到任何一致的东西。

有人告诉我,该过程基本上包括三个步骤:

1)用模块和指数生成RSA公钥。2)用公钥加密文本。3)在base640中再次加密文本。

如果您想知道为什么我需要遵循这三个步骤是因为我正在使用银行应用程序,而这些是他们的要求。

我一直在搜索,我什至没有找到如何迈出第一步,用模块和指数生成公钥(我已经有了)。

任何帮助将不胜感激。

谢谢。


是不是我自己构建了整个应用程序。我们是一个团队,我只需要使用 RSA 加密客户端密码并将其发送到流程的下一步。我确实有使用 Blackberry 和 RSA 的经验,但是在 Java 中,这个过程稍微容易一些,例如:在 java 中,一旦你得到模块和公共指数,第一步就是通过一个非常简单的语法创建 RSA 公钥对象: RSAPublicKey publicKey = new RSAPublicKey(new RSACryptoSystem(2048),ebytes, mbytes);. 在这部分我有点迷失,因为我没有找到合适的 BB10 文档。如果我创造了我自己创建一个完整的加密 API 的错觉,我很抱歉。BB10 有这个基于 hursa.h 的安全 API (https://developer.blackberry.com/native/beta/reference/com.qnx.doc.crypto/topic/about_rsa_raw.html) 我' 我试图实现它,但我没有成功。@owlstead @dajames @bta

4

3 回答 3

3

我强烈建议您利用现有的加密库来为您处理所有这些。 OpenSSL被广泛使用,LibTom库也包含一个加密库。从头开始实施加密并不是一件容易的事情,通过使用现有的实施,您将节省大量时间和挫败感。OpenSSL 尤其是一个不错的选择,因为它已多次通过 FIPS 认证测试。由于您正在开发银行应用程序,因此您(和您的客户)很可能希望使用经过认证的实现。

即使您坚持从头开始实现自己的加密库,我也鼓励您查看上述库作为示例。

于 2012-10-09T20:52:52.740 回答
1

在我看来,您对这种密码学的工作原理的了解甚至比您想象的还要少。

通常不使用 RSA 加密来加密数据。可以使用 PIN 或密码之类的简短内容来完成此操作,但通常会生成对称密钥并使用对称密钥加密数据,然后使用 RSA 加密对称密钥。

如果您要向银行发送密码,那么您可能应该做的是使用银行在他们自己的密钥证书中提供的 RSA 密钥。只有银行有私钥,所以只有他们才能解密密码。如果这是正确的,那么您不需要生成 RSA 密钥,但您确实需要验证证书是否可信。

我不编写黑莓程序,所以我不知道它们支持哪些加密 API,但我希望您需要内置的所有内容。这都是非常标准的东西。

我建议您在开始设计解决方案之前先阅读公钥密码学(例如在此处此处的 Wikipedia 上)。

于 2012-10-09T21:39:33.447 回答
0

解决。在做了一些研究并更好地了解 BB10 编码和 RSA 之后,我终于想出了在 C/C++ 中使用 RSA 和 Base64 成功加密纯文本的解决方案,用于 BB10 或任何其他平台。请考虑到我有来自我正在使用的服务的 rsa 对象的模数和公共指数。

编码:

    QByteArray answer;

    RSA* rsa = RSA_new();

    BIGNUM *modulus = BN_new();
    BIGNUM *exponent = BN_new();
    const char *modulusString = rsaObj->getM(); //My Modulus
    const char *exponentString = rsaObj->getE(); //My exponent

    BN_hex2bn(&modulus, modulusString);
    BN_hex2bn(&exponent, exponentString);

    rsa->n = BN_new();
    BN_copy(rsa->n, modulus);
    rsa->e = BN_new();
    BN_copy(rsa->e, exponent);

    int maxSize = RSA_size(rsa);
    qDebug() << "maxSize:" << maxSize;

    const char *inn = "1234";
    unsigned char *encrypted = (unsigned char*) malloc(maxSize);
    int bufferSize = RSA_public_encrypt(strlen(inn), (unsigned char *) inn,
            encrypted, rsa, RSA_PKCS1_PADDING);

    if (bufferSize == -1) {
        RSA_free(rsa);
        qDebug() << "Error";
    }

    QByteArray enc = QByteArray::fromRawData((const char*) encrypted, 256);
    answer = enc.toBase64();

    return answer;

谢谢,我希望这对新的 BB10 开发人员有所帮助

于 2012-10-17T18:53:47.890 回答