問題タブ [libgcrypt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - libgcrypt セキュア メモリ
libgcrypt マニュアルから:
Libgcrypt はセキュア メモリと呼ばれる概念を使用します。これは機密データを格納するために確保されたメモリ領域です。このようなメモリは希少なリソースであるため、事前に固定サイズに設定する必要があります。さらに、ほとんどのオペレーティング システムには、セキュア メモリの使用方法に関する特別な要件があります。たとえば、アプリケーションを「setuid(root)」としてインストールして、そのようなメモリを割り当てられるようにする必要がある場合があります。[...] メモリ内のキーやその他の情報がディスクにスワップ アウトされないように保護し、使用済みメモリと解放済みメモリの自動上書きを有効にする必要がある場合は、[...]
この安全なメモリがどのように機能するかについて、私は少し混乱しています。
私はaes256-cbcファイル暗号化を行うソフトウェアを開発しており、IV + CIPHERTEXTのMAC(sha512を使用したhmac)も計算するため、機密情報を保存するにはセキュアメモリを使用する必要があります。
「セキュアメモリ」の概念について私が理解していないのは次のとおりです。
- 私がこれを持っているとしましょう:
unsigned char *key; key = malloc(32);
. ライブラリは、この変数がセキュア メモリを "malloced" にすることを望んでいることをどのように知ることができますか? - 「解放されたメモリの自動上書き」は、それが消去されることを意味する
free(key)
ので、ポインタを解放する前にメモリをmemsetする必要はありませんか?
c - gcry_malloc_secure を使用する場合の C でのメモリ管理
GNU/Linux で libgcrypt 1.5.0 を使用して、小さな aes256-cbc ファイル暗号化ソフトウェアを開発しています。
安全なメモリとディスクにスワップアウトされたデータについて疑問があります。
このコードがあるとしましょう:
これら 2 つのことを行うことは有用であり、必要ですか?
1)そのメモリのページングを許可しない: mlock(crypto_key, size)
2)情報がコア ダンプに書き込まれないようにするには、次のコマンドを使用します。
c - Mingw 用の libgcrypt のビルド/リンク
プログラムに libgcrypt のいくつかの機能を実装したいのですが、現在は Windows、OSX、および Linux (Arch/Xubuntu) で実行されているため、3 つのプラットフォームすべてでビルドできる場合にのみ実装できます。OSX と Linux では問題ありませんでした。
libgcryptとlibgpg-errorの github ページからソースを取得し、 Linux と OSX の両方でライブラリを正常にビルドして実行したので、テスト コードが有効であることがわかりました(現在、Windows で問題が発生しています)。 w/MinGW)。
Xubuntuで次のことを行いました(Archでも同様ですが、apt-getの代わりにpacmanを使用しています):
クロス コンパイル ツール チェーンを取得し、
ビルドすると、これらのファイルが home/myuser/w32root/ に正常にビルドされます。
- libgcrypt.a
- libgcrypt.def
- libgcrypt.dll.a
- libgcrypt.la
- libgpg-error.dll.a
- libgpg-error.la
含む/
- gcrypt.h
- gcrypt-module.h
- gpg-error.h
これらのファイルを Windows に引き継いで、テスト コード (ローカルで main.c という名前) をコンパイルしてみました。
しかし、未定義の参照エラーが発生し、ライブラリが正しくリンクされていないという結論に至りました (最初は libgcrypt.a のみを使用していました)。デフ、他。動作するようになったので、それらをすべて C:\Mingw\lib にドロップして、違いがあるかどうかを確認しました。しませんでした。以下も、リンクするライブラリ ファイルを見つける際に沈黙していましたが、未定義の参照を解決しませんでした。
だから、ここからどこへ行けばいいのか本当にわかりません。readme は、Windows 側にいるときにどのファイルをコピーしてリンクするかなど、クロス コンパイルにあまり関与しません。任意のポインター (私が見逃したドキュメントへの参照) を歓迎します! 私の文章の壁を読んでくれてありがとう。
c - MPIのunsignedint(基数10 / 10進数)値を出力します
16進数のmpi値のunsignedint(基数10 / 10進数)値を確認/取得しようとしています。私は次のコードを使用しています:
そして私は次の結果を得ています:
'result:'行を使用して、実際のunsigned int(基数10 / 10進数)値を出力します。
秘密鍵は、私が使用しようとしているOff-The-RecordPidginプラグインから取得しています。
編集:
実際のunsignedint(基数10 / 10進数)の値が
415325779662433871844955547383752003988573073626
プログラムを更新して、この値を使用してgcryptに新しいmpiを作成し、HEX値がすでに持っている値と同じであるかどうかを確認できます。これは今日の後半に行います。
編集2:
だから私は上記のint値のHEX値を出力するために次のことをしようとしています。何か問題が発生しています:
出力は次のとおりです。
編集3:
投稿を少し更新しました。基本的には、gcryptライブラリによって生成された16進値の10進数のbase10値を出力しようとしています。これらの値を読み取るために作成した実装を確認するために、この値を探しています。これを実現するためのgcrypt関数を探していました。gcryptはこれをサポートしていないようですか?
cryptography - Libgcrypt raw フラグを使用して暗号化された C# Bouncy Castle を使用して AES キーを復号化するにはどうすればよいですか?
概要: AES128 で暗号化されたファイルを復号化 (および最終的には暗号化して返す) しようとしています。AES キーは、libcrypt の RSA プロバイダーを使用して暗号化されます。Windows 7 で C# と BouncyCastle を使用して AESKey を復号化しようとすると、"ProcessBlock" を呼び出すと "block truncated" エラーがスローされます。データを BigEndian に変換しようとしましたが、RsaKeyParameters を作成しようとすると「有効な RSA 指数ではありません」というメッセージが表示されます。
暗号化は、Linux システムで libgcrypt 1.2x を使用して行われました。このコード スニペットはパディングが使用されていないことを示しているため、パディングの問題だと思います。
gcry_sexp_build(&PlainKeyExp, NULL, "(data (flags raw) (value %s))", AESKey );
残念ながら、元のシステムを変更することはできません。役立つコード サンプルとキーを以下に示します。これは、過去3日間、私を狂気に駆り立てています。interwebz を精査しましたが、解決策が見つかりませんでした。よろしくお願いいたします。
元のコード スニペット
コード スニペットのデコード
c# - 256ビットキーでaes128暗号を呼び出すときのlibgcryptの違いは何ですか?
これは私の前の質問 ( RSA Decryption)の続きです。
編集:以下の答えは明確で簡潔でした。以下にサンプル コードをいくつか追加しました。今日テストして、また投稿します。クライアント アプリケーションは 256 ビット キーを作成していますが、gcry_cipher_setkey を呼び出すと、アルゴリズムから返されたキーの長さが使用されます。したがって、setkey が 256 ビット キーを 128 ビットに切り捨てていると推測しています。テストするのに十分簡単です。
aes128 / cbc / パディングなしで libgcrypt を使用して暗号化されたファイルを復号化しようとしています。暗号化を行っている 2 つの異なるアプリケーションがあり、どちらも私には制御できません。1 つは 128 ビットの AES キーを使用し、もう 1 つは 256 ビットのキーを使用しています。それ以外の場合、すべての内部呼び出しは同じです。
編集: 疑似暗号化コードは次のとおりです:編集 2:順序を修正し、将来のユーザーのためにコメントを追加しました:
したがって、私の C# コードでは、復号化を開始する前にこれを行います。
ファイルを復号化するために C# と bouncycastle を使用しています。128bit キーで暗号化されたファイルの復号に成功しました。ただし、キーが 256bit の場合は失敗します。失敗は、出力が文字化けしていることを意味します。
両方のソースで AES キーが正しく復号化されていることを確認しました。
私の質問は、キーが 256 ビットの場合、Libgrypt の違いは何ですか? それとも、復号化が失敗する理由を見つけるための正しい方法ですか? あなたが私を指すことができる情報や指示をありがとう.
ブライアン
c - パスワード生成エラー
PBKDF2 を使用して、SHA-256 を使用してパスワードからキーを生成しています
次の質問があります。
私の関数は常に「パスワードからのキー生成エラー」を出力しますが、エラーメッセージを出力すると、成功が出力されます。パスワードを生成するときにエラーが発生するのはなぜですか?
の値が持つべきかどうかはわかりません
keysize
。そのパラメーターに何を入力する必要があるかを誰かが説明できますか?このコードを実行すると、行でセグメンテーション違反が発生します
gcry_kdf_derive
。なぜそれが起こるのでしょうか?
ありがとう。
c - 4 バイトの数値を 16 バイトの数値として表す方法はありますか?
4 バイトの IVを使用して一部のデータを暗号化する必要があります。ただし、私が使用している暗号化アルゴリズム (AES128) には 16 バイト (128 ビット) のキーが必要です。たとえば、私のコードは次のとおりです。
keyBuffer
たとえば、16 バイトのキーが含まれており、output`bytes,
はそれぞれ入力と出力です。IVを適切に与えるにはどうすればよいですか?
c - Cでlibgcrypt APIを使用するaes-gcm
私は libgcrypt (Gentoo x64 の v1.6.1) で遊んでいて、既に aes256-cbc と aes256-ctr を実装 (および AE テスト ベクトルでテスト) しました。今、私は aes256-gcm を見ていますが、ワークフローについて疑問があります。以下に、単純な暗号化プログラムのスケルトンを示します。
GCM モードでは、次の命令も必要です。
したがって、暗号化プログラムの正しいワークフローは次のとおりです。
しかし、私が理解していないのは次のとおりです。
abuf
塩っぽい?(だから私はそれを使用して生成する必要がありgcry_create_nonce
ますか?)- ファイルを暗号化したい場合、
void *tag
何を出力ファイルに書き込む必要がありますか?