0

解決しました(私の答えを探してください)。C++でRSAを使用してパスワードを暗号化するのに助けが必要です。私はC++のBlackberry10で働いており、RSAチュートリアルなど、暗号化プロセスを説明するものを探していましたが、残念ながら、一貫性のあるものは見つかりませんでした。

このプロセスは基本的に3つのステップで構成されていると言われています。

1)モジュールと指数を使用してRSA公開鍵を生成します。2)公開鍵でテキストを暗号化します。3)base640でテキストを再度暗号化します。

なぜ私がこの3つのステップに従う必要があるのか​​疑問に思っているのは、私が銀行のアプリで作業しているためであり、それらが彼らの要件です。

私はずっと検索してきましたが、最初のステップを実行する方法、モジュールと指数を使用して公開鍵を生成する方法さえ見つかりませんでした(私はすでに両方を持っています)。

どんな助けでもありがたいです。

ありがとう。


アプリ全体を自分で作成しているわけではありません。私たちはチームであり、RSAを使用してクライアントパスワードのみを暗号化し、プロセスの次のステップに送信する必要があります。私はBlackberryとRSAでの作業経験がありますが、Javaでは、プロセスが少し簡単です。たとえば、Javaでは、モジュールと公開指数を取得した後の最初のステップは、非常に単純な構文でRSA公開鍵オブジェクトを作成することです。 RSAPublicKey publicKey = new RSAPublicKey(new RSACryptoSystem(2048)、ebytes、mbytes);。この部分では、適切なBB10ドキュメントが見つからなかったため、少し迷っています。暗号化API全体を自分で作成しているような錯覚を起こしてしまったらごめんなさい。BB10には、hursa.h(https://developer.blackberry.com/native/beta/reference/com.qnx.doc.crypto/topic/about_rsa_raw.html)に基づくこのセキュリティAPIがあります。mそれを実装しようとしていますが、私は成功していません。@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についてよく理解した後、BB10またはその他のプラットフォーム用のC /C++でRSAとBase64を使用してプレーンテキストを正常に暗号化するソリューションをついに思いつきました。私が使用しているサービスからの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 に答える