Cách tiếp cận của bạn chỉ có thể được áp dụng cho RSA và chỉ khi bạn đang sử dụng các khóa được tạo theo phiên bản PKCS#11 >= 2.40. Tiêu chuẩn PKCS#11 xác định (phần 2.1.3 "Đối tượng khóa riêng RSA" trong đặc tả cơ sở 3.0): "Có hiệu lực với phiên bản 2.40, mã thông báo cũng PHẢI lưu trữ CKA_PUBLIC_EXPONENT."
Do đó, bạn có thể lấy các thuộc tính mô-đun và số mũ công khai (C_GetAttributeValue) và tạo một đối tượng khóa công khai từ nó bằng cách sử dụng C_CreateObject. Nhưng như DannyNiu đã chỉ ra rằng điều này chắc chắn sẽ ảnh hưởng đến hiệu suất.
Tùy thuộc vào mã thông báo, bạn có thể sử dụng đối tượng khóa riêng thay vì khóa chung cho các hoạt động như C_Encrypt* hoặc C_Verify* vì mã thông báo sẽ chỉ sử dụng các thuộc tính chung.
Đối với các khóa bất đối xứng khác, vd. Khóa EC, không có định nghĩa tương tự như định nghĩa cho RSA trong tiêu chuẩn PKCS#11. Do đó, sẽ không có phần công khai nào được lưu trữ. Nó sẽ phụ thuộc vào mã thông báo nếu khóa công khai được tính toán nhanh chóng (xác nhận nhận xét của Conrado). Điều này chắc chắn có tác động hiệu suất thậm chí còn cao hơn. Nếu mã thông báo không tự động thực hiện, thì không có cách nào để kích hoạt tính toán khóa chung từ khóa riêng từ PKCS#11.Và tất nhiên, bạn không bao giờ nên làm điều đó ở bên ngoài - tại sao bạn lại sử dụng mã thông báo (HSM) nếu bạn sử dụng khóa riêng ở bên ngoài?
Cuối cùng, nếu bạn sử dụng các ứng dụng tiêu chuẩn, cách tiếp cận của bạn có thể sẽ thất bại vì các ứng dụng thường thêm CKA_CLASS=CKO_PUBLIC_KEY vào mẫu tìm kiếm khi chúng tìm kiếm khóa chung mà chúng muốn sử dụng.