4

良い一日。

キーのプライベート (パブリックではない) 部分でメッセージを暗号化し、パブリックで復号化するように Windows CryptoAPI に教える必要があります。これは、ユーザーが読み取ることはできるが変更できない情報をユーザーに提供するために必要です。

現在の仕組み:

コンテキストを取得します

CryptAcquireContext(@Prov, PAnsiChar(containerName), nil, PROV_RSA_FULL, 0)

キーペアを生成する

CryptGenKey(Prov, CALG_RSA_KEYX, CRYPT_EXPORTABLE, @key)

暗号化 (問題はここにあります。「キー」 - キーペアであり、関数はその公開部分を使用します);

CryptEncrypt(key, 0, true, 0, @res[1], @strLen, buffSize)

復号化 (ここでも同じ問題、鍵の秘密部分を使用)

CryptDecrypt(key, 0, true, 0, @res[1], @buffSize)

ご清聴ありがとうございました。

アップデート

はい、デジタル署名やその他の方法を使用できます...

問題は、1 つのデータベース フィールドを暗号化し、それを変更できるのは私だけである必要があることです。私のプログラムの助けを借りてのみ、このフィールドを読み取ることができます (誰かが逆コンパイルして公開鍵を取得するまで)。これは対称キーとデジタル署名で行うことができますが、別のフィールドを作成して別のキーを保存する必要があります...

どうにかして WIN API に自分のやりたいように教えられることを願っています。私は RSA でそれができることを知っており、何らかの方法で WinAPI がこの機能をサポートすることを願っています。

4

2 に答える 2

3

厳密に言えば、メッセージに「署名」する場合:

  • 秘密鍵を持つ人は、自分の秘密鍵でハッシュを復号化します。
  • 次に、その「復号化された」ハッシュをメッセージとともに送信します。
  • 次に、受信者は公開鍵で署名を暗号化します

「暗号化された」ハッシュが元のメッセージのハッシュと一致する場合、メッセージが改ざんされておらず、秘密鍵を持つ人物によって送信されたことがわかります。次の疑似コードは、署名アルゴリズムを表しています。

//Person with private key generating message and signature
originalHash = GenerateHashOfMessage(message);
signature = RsaDecrypt(originalHash, privateKey);

//Receiver validating signed message
hash = GenerateHashOfMessage(message);
originalHash = RsaEncrypt(signature, publicKey);
messageValid = (hash == originalHash);

これと同じメカニズムを使用して、目的を達成できます。hashを気にしない場合を除いて、データの一部 (少量) を暗号化したいだけです。

//Person with private key
cipherText = RsaDecrypt(plainText, privateKey);

//Person with public key
plainText = RsaEncrypt(cipherText, publicKey);

CryptoAPIMicrosoft の Crypto API をまだ理解しようとしているので、呼び出しは演習として残します。

于 2012-10-17T23:42:49.897 に答える
2

秘密鍵でデータを暗号化し、公開鍵で復号化することはサポートされていません。これは、「公開された」公開鍵を持っている人なら誰でもデータを復号化できるためです。それを暗号化することの価値は何ですか?

データが変更されていないことを確認したい場合は、代わりにデータに署名する必要があります。署名は、秘密鍵を使用してデータのハッシュを暗号化します。署名関数を見てください。

署名機能をだまして、やりたいことができるかもしれません。私は他の実装でこれを行いましたが、Microsoft CryptoAPI では試していません。

また、RSA 暗号化では、プレーン テキスト メッセージをキーより長くすることはできません。そのため、2048 ビットのキーを使用している場合、最大 256 バイトのメッセージ本文のみを暗号化できます (オーバーヘッドのために数を差し引いたもの)。

対称キーを渡すためだけに非対称暗号化を使用し、対称キーを使用して任意のサイズのデータ​​を暗号化および復号化することを検討してください。

アップデート

これにはCryptSignHash()関数を使用できる場合があります。通常、これはハッシュに「署名」するために使用されますが、必要なデータをハッシュに入れることができます。

CryptSetHashParam の dwParam パラメータの HP_HASHVAL 値を使用して、ハッシュ オブジェクトにハッシュ値を設定します。

入力が SHA1 ハッシュ値であると予想される場合、非常に多くのバイトに制限される可能性があります。

または、OpenSSL の使用を検討することもできます。私の記憶が正しければ、RSA 署名機能を使用して秘密鍵で暗号化するのは非常に簡単です。

また、SecureBlackbox の古い (フリーウェア) バージョンを使用して同じことを達成しました。古い無料バージョンを見つけることができるかもしれませんが、Unicode に対応していないため、新しい Delphi を使用している場合は、何らかの変換を行う必要があります。これも過去にやったことがありますので、それほど難しいことではありません。

また、現在の SecureBlackbox を試してみて、それが機能する場合は購入することも検討してください。

それ以外の場合は、あなたが述べたように、署名して改ざんを検出し、難読化するためにプログラムだけが知っている対称キーで暗号化します。

彼らがあなたのコードをクラックしたとしても、とにかく公正なゲームです。

于 2012-06-11T20:09:20.677 に答える