Tôi đang cố mã hóa khóa đối chứng bằng RSA (Khóa trao đổi trong CSP) trong C# bằng cách sử dụng đoạn mã này (khóa RSA CSP50C8C7CD không thể xuất được và trong HSM):Mã hóa RSA với khóa không thể xuất trong HSM bằng C#/CSP
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);
Thấy nhật ký CSP, tôi lưu ý rằng C# đang cố gắng xuất khóa để tiếp tục thao tác. Nhật ký CSP bên dưới chỉ hiển thị các mảnh về rsa_dnet.Encrypt sử dụng:
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.
của Windows SO đang kêu gọi một CryptExportKey qua PRIVATEKEYBLOB nghĩa để xuất khẩu de khóa riêng.
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
Trong HSM log này cho thấy Windows SO đang cố gắng để trích xuất các khóa bí mật (những gì có nghĩa là Erro vì quan trọng là không thể xuất khẩu).
Khi tôi sử dụng một CSP50C8C7CE trọng xuất khẩu trong HSM, chương trình log đó là tất cả mọi thứ phải:
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'
Lưu ý rằng bản ghi này cho thấy rất nhiều của các hoạt động nhập khẩu/xuất khẩu chủ lực RSA (Tham khảo: CSP50C8C7CE - chìa khóa có thể xuất khẩu).
Câu hỏi: Chức năng mã hóa trong thư viện System.Cryptography cần khóa phải luôn có thể xuất được? Hoặc tôi phạm sai lầm trong chương trình của tôi? Bất kỳ tham số bị mất có lẽ?
ý tưởng là sử dụng mã hóa trên HSM và sử dụng CSP để làm như vậy. Mục đích của Bộ luật sẽ không thực hiện mã hóa trong bộ nhớ. HSM cung cấp trình điều khiển CSP triển khai API cụ thể cho các microsoft như vậy. Chức năng ** rsa_dnet.Encrypt (tripleDES.Key, false) ** không nên cố trích xuất khóa cá nhân vì cờ CspProviderFlags.UseNonExportableKey được bật. – Vasconcelos