8

このコードを使用して、C# で RSA (CSP の交換キー) で対称キーを暗号化しようとしています (RSA キー CSP50C8C7CD はエクスポートできず、HSM にあります):

CspParameters csp_dnet = new CspParameters(1, "HSM especific CSP");
csp_dnet.Flags = CspProviderFlags.UseNonExportableKey;
csp_dnet.KeyContainerName = "test";

RSACryptoServiceProvider rsa_dnet = new RSACryptoServiceProvider(csp_dnet);

// Create 3DES key
TripleDES tripleDES = new TripleDESCryptoServiceProvider();

// Encrypt 3DES with RSA
byte[] encryptedSessionKey = rsa_dnet.Encrypt(tripleDES.Key, false);

CSP ログを見ると、C# が操作を続行するためにキーをエクスポートしようとしていることがわかります。以下の CSP ログは、rsa_dnet.Encryptの使用に関する部分のみを示しています。

LOG CSP

...

[12/12/2012 17:28:45] [3688] D [CryptExportKey]  Blob type: PRIVATEKEYBLOB

...

[12/12/2012 17:28:45] [3688] E [CryptExportKey]  Return: FALSE. An internal error occurred.

Windows SO は、プライベート キーをエクスポートすることを意味する PRIVATEKEYBLOB を渡す CryptExportKey を呼び出しています。

LOG HSM

...
2012/12/12 17:44:02 [4DD18140] new key 'test/CSP50C8C7CD', t: 6, a: 0
2012/12/12 17:44:14 [4DC2A1C0] 'test' auth ok, 10.0.87.19
2012/12/12 17:44:17 [4DC2A1C0] 'test/CSP50C8C7CD' not exportable, conn: 9  --- ERROR

HSM では、このログは、Windows SO が秘密キーを抽出しようとしていることを示しています (これは、キーがエクスポートできないため、ERRO を意味します)。

HSM でエクスポート可能なキー CSP50C8C7CE を使用すると、ログにすべて問題がないことが示されます。

LOG HSM

...

2012/12/12 17:47:46 [4DEF4040] 'test' auth ok, IP: 10.0.87.19
2012/12/12 17:47:46 [4DEF4040] export: 'test/CSP50C8C7CE', 1462
2012/12/12 17:47:46 [4DEF4040] export: 'test/CSP50C8C7CE', 1462
2012/12/12 17:47:46 [4DEF4040] delete 'test/CSP50C8C7CE'
2012/12/12 17:47:46 [4DEF4040] import obj 'test/CSP50C8C7CE', 00000004
2012/12/12 17:47:46 [4DEF4040] pk test/CSP50C8C7CE [1]
2012/12/12 17:47:46 [4DEF4040] import obj 'cf1c34c8be5d2fa8a4575c63dd903454', 00000003
2012/12/12 17:47:46 [4DEF4040] delete 'test/CSP50C8C7CE'
2012/12/12 17:47:46 [4DEF4040] import obj 'test/CSP50C8C7CE', 00000006
2012/12/12 17:47:47 [4DEF4040] export: 'cf1c34c8be5d2fa8a4575c63dd903454', 24
2012/12/12 17:47:47 [4DEF4040] delete 'cf1c34c8be5d2fa8a4575c63dd903454'

このログは、多くの RSA キーのインポート/エクスポート操作を示していることに注意してください (参照: CSP50C8C7CE - エクスポート可能なキー)。

質問: ライブラリ System.Cryptography の Encrypt 関数では、キーを常にエクスポート可能にする必要がありますか? または、プログラムに間違いがありますか?おそらくパラメーターがありませんか?

4

1 に答える 1

4

メモリ内の暗号化または復号化のために、HSM でエクスポート不可能なキーを使用することはできません。メモリ内で暗号化を行おうとすると、.NET は秘密鍵をメモリにフェッチしようとしますが、HSM によって阻止されます。一方、秘密鍵のハンドルを取得して、「暗号化/復号化するデータ」を HSM に送信できます。つまり、ハンドルを指定することで、データに含まれる秘密鍵でデータを暗号化するように HSM に指示できます。

HSM は、PKCS11 標準を実装し、多くの場合 C で記述された API を提供する必要があります。このアンマネージ ライブラリからメソッドを抽出し、C# で使用できます。ここでは、C# で記述された PKCS11 ラッパー ライブラリを見つけることができます。

于 2012-12-19T21:23:29.080 に答える