2016-07-27 3 views
0

私はWeb開発者であり、C++を初めて使っています。私はQt C++を使用しています。 QtでPBKDF2キーを生成する方法を探していましたが、純粋なC++でPBKDF2キーを生成する方法が見つかりませんでした。だから私はこの小さなCの実装https://github.com/ctz/fastpbkdf2を発見したインターネットで探しています。私は、私は私が直接++、CのいずれかのC関数を呼び出すことができます知っているQt C++のC関数の使い方

QString password = "password"; 
QString salt = "salt"; 
int iterations = 30000; 

を持って次の関数に私のC++ファイルで

void fastpbkdf2_hmac_sha256(const uint8_t *pw, size_t npw, 
          const uint8_t *salt, size_t nsalt, 
          uint32_t iterations, 
          uint8_t *out, size_t nout) 

を使用する必要があるが、私は、私が呼び出すことができるかわからないです私のC++ファイルからそれらのパラメータで機能します。データ型変換の説明も理解できます。

+0

私は人々がQStringを(toStdString()またはQByteArrayを使用して)変換するさまざまな方法を列挙していることに気付きました。どちらが優先されるでしょうか? –

+0

また、この関数の出力をどのように表示するかについても明確にしたいと思います。 –

+0

また、uint8_tをQStringに変換する方法はありますか? –

答えて

1

あなたはchar型(またはuint8_t)するのQStringに変換する必要があるすべて:

QString passoword = "password"; 
QByteArray ba = password.toLatin1(); 
const uint8_t *pw = (const uint8_t*)ba.data(); 

そして、あなたは、関数でこのPWを使用することができます。 「塩」と同じ。 "反復"はそのまま使用できます。 "out"パラメータの場合は、uint8_tを任意の方法で割り当ててください。これはmallocでもかまいません。

+2

Latin-1の範囲外のUnicode文字をサポートする場合は、代わりにtoUTF8()を呼び出すと便利です。 –

1

uint8_tは、符号なし8ビット整数、つまり符号なしcharのtypedefです。

uint32_tは、符号なし32ビット整数、つまり符号なし整数のtypedefです。

これらのtypedefは、stdint.hで定義されています。これらの型は、移植性のために明確に定義された(幅方向の)整数型を持つように導入されました。

size_tは、通常、符号なし整数型です。だから、 プロトタイプ:

void fastpbkdf2_hmac_sha256(const uint8_t *pw, size_t npw, 
          const uint8_t *salt, size_t nsalt, 
          uint32_t iterations, 
          uint8_t *out, size_t nout) 

は同等です:

void fastpbkdf2_hmac_sha256(const unsigned char* pw, unsigned int npw, 
          const unsigned char* salt, unsigned int nsalt, 
          unsigned int iterations, 
          unsigned char* out, unsigned int nout); 

その他は、符号なし文字配列にQStringのを変換する方法を掲載しています。

+0

これはほとんどのプラットフォームに当てはまりますが、C99の型( '_t'を持つもの)は本質的に移植性が高くなるように仕様が定義されていることに注意してください。 'unsigned int'とそのフォーマットに続く他のものはコンパイラの型であり、コンパイラの実装によってそれらを定義します。単一のプラットフォーム用のコードを記述している場合や、コードが基本となるメモリの内容を正確に把握する必要がない場合は、コンパイラの型は問題ありません。 – Iverelo

-1

私はQTに慣れていないので、this pageをQStringのリファレンスとして検討しています。これは管理された文字列オブジェクトのように見えますが、あなたが呼び出す関数はnullで終了する配列uint8_tsを必要とします。私はtoStdString()メンバ関数があるので、std :: stringをラップしていると思います。 std :: stringはあなたの関数が望むような文字配列を管理するだけです。password.toStdString()。c_str()を使ってchar *を取得します。

ほとんどのプラットフォームでは、ほとんど常に1バイトのメモリが使用されるため、uint8_tとcharは暗黙的に変換されます。

出力バッファもあり、呼び出し規約ではそのメモリを管理する必要があるようです。あなたがリンクしているgithubのドキュメントを一見して見ると、noutを使ってそれを伝えるメモリが多くなります。この例では、出力するための256バイトのバッファを作成します。

QString password = "password"; 
QString salt = "salt"; 
int iterations = 30000; 

const size_t nout = 256; 
uint8_t * out = new uint8_t[nout]; 

fastpbkdf2_hmac_sha256(password.toStdString().c_str(), password.toStdString().size(), 
    salt.toStdString().c_str(), salt.toStdString().size(), 
    iterations, 
    out, nout); 

// use out 

delete[] out; 
+0

これは私に次のエラーを与えます: 'const char *'から 'const uint8_t * {aka const unsigned char *}'への無効な変換 –

+0

[reinterpret_cast](http://en.cppreference.com/w/cpp/) language/reinterpret_cast)()は、基礎となるメモリが同一であるためコンパイラを騙します。 – Iverelo

+0

これはうまくいくようです –

関連する問題