GnuPGMEのチュートリアルを書いたり文書を書いたりしていますので、gpgSign(std::string fileToBeSigned, std::string outPutFileName)
のような関数をC++で書くことができますか?GnuPGME:GPG Signature C++
答えて
以下は、あなたが探していることを行う冗長なコメントを持つCの例です。最も直接的なアプローチではありませんが、ファイルへの署名方法を説明する必要があります。それは署名者の選択を処理しませんが、GPGMEのドキュメントがあなたを助けるはずです。
ファイルを保存して編集し、コマンドラインから直接テストすることができます。コンパイルするには、 "gpgsign.c"として保存し、gcc gpgsign.c -lgpgme -o gpgsign
を実行してください(注:libgpgmeがインストールされている必要があります)。次に、使用してgpgsign <input file> <output file>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <errno.h>
#include <locale.h>
#include <gpgme.h>
#define fail_if_err(err) \
do { \
if (err) { \
fprintf (stderr, "%s:%d: %s: %s\n", \
__FILE__, __LINE__, gpgme_strsource (err), \
gpgme_strerror (err)); \
exit (1); \
} \
} \
while (0)
void gpgSign(const char *fileToBeSigned, const char *outputFileName) {
gpgme_ctx_t ctx;
gpgme_error_t err;
gpgme_data_t in, out;
FILE *outputFile;
int BUF_SIZE = 512;
char buf[BUF_SIZE + 1];
int ret;
/* Set the GPGME signature mode
GPGME_SIG_MODE_NORMAL : Signature with data
GPGME_SIG_MODE_CLEAR : Clear signed text
GPGME_SIG_MODE_DETACH : Detached signature */
gpgme_sig_mode_t sigMode = GPGME_SIG_MODE_CLEAR;
/* Begin setup of GPGME */
gpgme_check_version (NULL);
setlocale (LC_ALL, "");
gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
#ifndef HAVE_W32_SYSTEM
gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL));
#endif
/* End setup of GPGME */
// Create the GPGME Context
err = gpgme_new (&ctx);
// Error handling
fail_if_err (err);
// Set the context to textmode
gpgme_set_textmode (ctx, 1);
// Enable ASCII armor on the context
gpgme_set_armor (ctx, 1);
// Create a data object pointing to the input file
err = gpgme_data_new_from_file (&in, fileToBeSigned, 1);
// Error handling
fail_if_err (err);
// Create a data object pointing to the out buffer
err = gpgme_data_new (&out);
// Error handling
fail_if_err (err);
// Sign the contents of "in" using the defined mode and place it into "out"
err = gpgme_op_sign (ctx, in, out, sigMode);
// Error handling
fail_if_err (err);
// Open the output file
outputFile = fopen (outputFileName, "w+");
// Rewind the "out" data object
ret = gpgme_data_seek (out, 0, SEEK_SET);
// Error handling
if (ret)
fail_if_err (gpgme_err_code_from_errno (errno));
// Read the contents of "out" and place it into buf
while ((ret = gpgme_data_read (out, buf, BUF_SIZE)) > 0) {
// Write the contents of "buf" to "outputFile"
fwrite (buf, ret, 1, outputFile);
}
// Error handling
if (ret < 0)
fail_if_err (gpgme_err_code_from_errno (errno));
// Close "outputFile"
fclose(outputFile);
// Release the "in" data object
gpgme_data_release (in);
// Release the "out" data object
gpgme_data_release (out);
// Release the context
gpgme_release (ctx);
}
int
main (int argc, char **argv) {
if (argc != 3) {
printf("Usage: gpgsign <input file> <output file>\n");
exit (1);
}
printf("Signing %s and placing the result into %s\n", argv[1], argv[2]);
gpgSign(argv[1], argv[2]);
return 0;
}
この答えはおそらく遅すぎる来る実行することができますが、私があなただったら、私はむしろ、単純なAPIを備えた高レベルの暗号化ツールキットですKeyczarを使用すると思います。 Java、C++、Pythonバインディングが利用可能です。
GPGMEはあまりにも多くの調整をしなくても暗号機能を必要とする人にとってはまだかなり低レベルのIMOです。もちろん、暗号の専門家はこの種の複雑さを必要とします。
個人的に、私は何か基本的なことをする前に、このエンジンとその文脈を100行の定型コードで設定する必要のあるライブラリを避けようとしていますが、私は何の専門家でもありません。
誰かが理由を言わずに私の答えを下落させました。私はなぜだろう:Keyczarはもともとよく頼まれた要件に合っています。私のもう1つのポイントはまだ立っています:私たちのほとんどは、非常に高レベルの暗号APIを必要としています。私たち全員が低レベルのAPIを作成する専門家の仕事に感謝しています。上記のすべての低レベルの手順を説明してくれたので、私はkylehuffに借りています。しかし、残りの部分については、関数gpgSign(const std :: string&fileToBeSigned、const std :: string&outPutFileName)が必要です。 –
私は人々がこの答えをdownvoting続ける理由を理解していません。私は_really_私が書いたものが間違っていることを説明するコメントを感謝します。いくつかの説明は上記の私のコメントを参照してください。ありがとう。 –
もし私が推測しなければならないのは、あなたの答えが質問された質問に話してくれないからです。質問される質問は、特に代替案の要求ではなく、GnuPG GPGMEに関するものでした。それはあなたの答え(および関連する点)にメリットがないと言っているわけではありません。質問された質問には該当しません。 – kylehuff
- 1. Signatureで検索
- 2. outlook contract Signature
- 3. Win32_DiskDrive Signatureプロパティ
- 4. Android Signature Capture
- 5. バグ? in codesland --remove-signature feature
- 6. Signature Capture in PhoneGap Androidアプリケーション
- 7. TypeScript汎用メソッドSignature in Interface
- 8. android:protectionLevel = "signature"を使用した問題
- 9. Facebookのリアルタイムアップデート:JavaでのX-Hub-Signature SHA1署名の検証
- 10. Signature Verifierが自分自身でチェックするとfalseを返す
- 11. org.dom4j.Documentをorg.w3c.dom.DocumentとXML Signatureに変換する際の問題
- 12. git statusは私にエラーを返します:bad index file sha1 signature
- 13. AJAXでPHP Instagram Signatureを使用するには?
- 14. opensslを使用してJava Signature signメソッドをエミュレートする方法は?
- 15. JNI_OnLoadエラー:signature()でネイティブ関数のdeclを見つけることができませんLjava/lang/String
- 16. Amazon S3からブラウザの.pdfファイルを開き、AWSのKeyとSignature属性を使用しますか?
- 17. なぜ、Signature(DefaultAuthenticationTypes.ExternalCookie)をASP.Net IdentityでApplicationCookieを使用する前に呼び出すのですか?
- 18. HMAC C#とJavaScript
- 19. このWebP C++関数の正しいC#PInvoke署名
- 20. Objective-CコードをプレーンCに変換する
- 21. 定数double * pArrを必要とするC++関数にC#double []を渡すには? C++は、C#の
- 22. Bitstamp - C#で新しい認証 - 署名
- 23. 解析JSON POSTリクエストのC#
- 24. C++ OpenGL glTexImage2Dアクセス違反
- 25. Windowsサーバーでプログラムを起動できません(Ninjectの問題、C#、.NET 4)
- 26. Objective-C:署名付きリクエストのデコード
- 27. はペイパルRESTのC#
- 28. C#構造体とNuSOAP(PHP)
- 29. C++ CLIに相当するC#動的キーワードは何ですか?
- 30. オブジェクトのJsonリストをデシリアライズするC#
ライブラリ自体はC言語で書かれています。つまり、C++内でライブラリを使用することができます。あなたはC++を使ってcライブラリを使うことだけを読むべきです。 – v01d
私はCライブラリを使うことができることを知っていますが、私は関数を書くことに近づくためにどこを見ても完全に失われています。 – allejo