2012-12-19 30 views
8

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ẽ?

Trả lời

3

Bạn không thể sử dụng khóa không thể xuất trong HSM để mã hóa hoặc giải mã trong bộ nhớ. Vì bạn cố gắng thực hiện mã hóa trong bộ nhớ .NET đang cố gắng lấy khóa cá nhân vào bộ nhớ và nó bị ngăn chặn bởi HSM. Mặt khác, bạn có thể xử lý khóa riêng và gửi "dữ liệu được mã hóa/giải mã" của bạn sang HSM. Nói cách khác, bạn có thể yêu cầu HSM mã hóa dữ liệu của bạn bằng khóa riêng mà nó chứa bằng cách chỉ định xử lý của nó.

HSM của bạn sẽ cung cấp cho bạn API triển khai chuẩn PKCS11 và thường được viết bằng C. Bạn có thể sử dụng các phương thức bên ngoài từ thư viện không được quản lý này và sử dụng chúng trong C#. Here bạn có thể tìm thấy thư viện trình bao bọc PKCS11 được viết bằng C#.

+0

ý 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

Các vấn đề liên quan