2

libgcrypt を使用して RSA 公開鍵で文字列を暗号化しようとしています。その selftest_encr_1024 サンプルはほとんどのことを示していますが、パディングの処理方法は示していません。これは、PKCS#1 タイプ 2 のパディングを追加しようとして書いたコードですが、パディングは追加されません。私は何が欠けているか、間違っていますか?

のぶ

string rsaEncrypt(const string& pubKey, const string& inText)
{
    string outText;

    gcry_sexp_t pkey = NULL;
    gcry_error_t err = gcry_sexp_sscan (&pkey, NULL, pubKey.c_str(), pubKey.length());

    if (!err) {
        gcry_mpi_t msg = NULL;
        size_t nScanned;
        err = gcry_mpi_scan (&msg, GCRYMPI_FMT_STD, inText.c_str(), inText.length(), &nScanned);

        if (!err) {        
            gcry_sexp_t plain = NULL;
            err = gcry_sexp_build (&plain, NULL, "(data (flags pkcs1) (value %m))", msg);

            if (!err) {        
                gcry_sexp_t encr  = NULL;
                err = gcry_pk_encrypt (&encr, plain, pkey);

                if (!err) {
                    gcry_mpi_t encrmsg = gcry_sexp_nth_mpi(encr, 0, GCRYMPI_FMT_USG);

                    vector<char> buff(inText.length() * 2);
                    size_t nWritten;
                    err = gcry_mpi_print(GCRYMPI_FMT_STD, (unsigned char*) &buff[0], buff.size(), &nWritten, encrmsg);

                    if (!err) {
                        Web::Base64::encode(outText, &buff[0], nWritten);
                    }

                    gcry_sexp_release(encr); encr = NULL;
                }
            }
        }
        gcry_sexp_release(pkey); pkey = NULL;
    }

    if (err) {
        std::cout << gcry_strerror(err) << std::endl;
    }

    return outText;
}
4

1 に答える 1