Fungsi CryptExportKey (wincrypt.h)
Handel ke kunci yang akan diekspor diteruskan ke fungsi, dan fungsi mengembalikan BLOB kunci. BLOB kunci ini dapat dikirim melalui transportasi yang tidak aman atau disimpan di lokasi penyimpanan yang tidak aman. Fungsi ini dapat mengekspor kunci sesi Schannel , kunci sesi reguler, kunci publik, atau pasangan kunci publik/privat. BLOB kunci yang akan diekspor tidak berguna sampai penerima yang dimaksud menggunakan fungsi CryptImportKey di dalamnya untuk mengimpor kunci atau pasangan kunci ke dalam CSP penerima.
Sintaks
BOOL CryptExportKey(
[in] HCRYPTKEY hKey,
[in] HCRYPTKEY hExpKey,
[in] DWORD dwBlobType,
[in] DWORD dwFlags,
[out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Parameter
[in] hKey
Handel ke kunci yang akan diekspor.
[in] hExpKey
Handel ke kunci kriptografi pengguna tujuan. Data utama dalam BLOB kunci yang diekspor dienkripsi menggunakan kunci ini. Ini memastikan bahwa hanya pengguna tujuan yang dapat menggunakan BLOB kunci. hExpKey dan hKey harus berasal dari CSP yang sama.
Paling sering, ini adalah kunci publik pertukaran kunci pengguna tujuan. Namun, protokol tertentu di beberapa CSP mengharuskan kunci sesi milik pengguna tujuan digunakan untuk tujuan ini.
Jika jenis BLOB kunci yang ditentukan oleh dwBlobType adalah PUBLICKEYBLOB, parameter ini tidak digunakan dan harus diatur ke nol.
Jika jenis BLOB kunci yang ditentukan oleh dwBlobType adalah PRIVATEKEYBLOB, ini biasanya merupakan handel ke kunci sesi yang akan digunakan untuk mengenkripsi BLOB kunci. Beberapa CSP memungkinkan parameter ini menjadi nol, dalam hal ini aplikasi harus mengenkripsi BLOB kunci privat secara manual sehingga dapat melindunginya.
Untuk menentukan bagaimana penyedia layanan kriptografi Microsoft merespons parameter ini, lihat bagian BLOB kunci privatdari Penyedia Layanan Kriptografi Microsoft.
[in] dwBlobType
Menentukan jenis BLOB kunci yang akan diekspor dalam pbData. Ini harus menjadi salah satu konstanta berikut seperti yang dibahas dalam Penyimpanan dan Pertukaran Kunci Kriptografi.
Nilai | Makna |
---|---|
|
Digunakan untuk menyimpan kunci sesi dalam CSP Schannel atau format khusus vendor lainnya. OPAQUEKEYBLOBLOB tidak dapat ditransfer dan harus digunakan dalam CSP yang menghasilkan BLOB. |
|
Digunakan untuk mengangkut pasangan kunci publik/privat. |
|
Digunakan untuk mengangkut kunci umum. |
|
Digunakan untuk mengangkut kunci sesi. |
|
PLAINTEXTKEYBLOB yang digunakan untuk mengekspor kunci apa pun yang didukung oleh CSP yang digunakan. |
|
Digunakan untuk mengekspor dan mengimpor kunci konten yang dibungkus dengan kunci konten lainnya. Kunci yang dibungkus aktual dalam format yang ditentukan dalam standar IETF RFC 3217 . |
[in] dwFlags
Menentukan opsi tambahan untuk fungsi tersebut. Parameter ini bisa nol atau kombinasi dari satu atau beberapa nilai berikut.
Nilai | Makna |
---|---|
|
Bendera ini menyebabkan fungsi ini mengekspor versi 3 dari jenis BLOB. |
|
Bendera ini menghancurkan kunci asli di OPAQUEKEYBLOB. Bendera ini hanya tersedia di CSP Schannel. |
|
Bendera ini menyebabkan pemformatan PKCS #1 versi 2 dibuat dengan enkripsi dan dekripsi RSA saat mengekspor SIMPLEBLOB. |
|
Delapan byte pertama dari padding blok enkripsi RSA harus diatur ke 0x03 daripada data acak. Ini mencegah serangan pemutaran kembali versi dan dibahas dalam spesifikasi SSL3. Bendera ini hanya tersedia untuk CSP Schannel. |
|
Bendera ini tidak digunakan. |
[out] pbData
Penunjuk ke buffer yang menerima data BLOB utama . Format BLOB ini bervariasi tergantung pada jenis BLOB yang diminta dalam parameter dwBlobType . Untuk format untuk PRIVATEKEYBLOBs, PUBLICKEYBLOBs, dan SIMPLEBLOB, lihat Blob Kunci Penyedia Dasar.
Jika parameter ini NULL, ukuran buffer yang diperlukan ditempatkan dalam nilai yang diarahkan oleh parameter pdwDataLen . Untuk informasi selengkapnya, lihat Mengambil Data Dengan Panjang Tidak Diketahui.
[in, out] pdwDataLen
Penunjuk ke nilai DWORD yang, pada entri, berisi ukuran, dalam byte, dari buffer yang diacu oleh parameter pbData . Saat fungsi kembali, nilai ini berisi jumlah byte yang disimpan dalam buffer.
Nilai kembali
Jika fungsi berhasil, fungsi mengembalikan bukan nol (TRUE).
Jika fungsi gagal, fungsi akan mengembalikan nol (FALSE). Untuk informasi kesalahan yang diperluas, hubungi GetLastError.
Kode kesalahan yang diawali oleh "NTE" dihasilkan oleh CSP tertentu yang digunakan. Tabel berikut ini memperlihatkan beberapa kemungkinan kode kesalahan.
Menampilkan kode | Deskripsi |
---|---|
|
Salah satu parameter menentukan handel yang tidak valid. |
|
Salah satu parameter berisi nilai yang tidak valid. Ini paling sering merupakan pointer yang tidak valid. |
|
Jika buffer yang ditentukan oleh parameter pbData tidak cukup besar untuk menyimpan data yang dikembalikan, fungsi mengatur kode ERROR_MORE_DATA dan menyimpan ukuran buffer yang diperlukan, dalam byte, dalam variabel yang ditunjukkan oleh pdwDataLen. |
|
Baik algoritma yang bekerja dengan kunci umum yang akan diekspor tidak didukung oleh CSP ini, atau upaya dilakukan untuk mengekspor kunci sesi yang dienkripsi dengan sesuatu selain salah satu kunci publik Anda. |
|
Parameter dwFlags bukan nol. |
|
Satu atau kedua kunci yang ditentukan oleh hKey dan hExpKey tidak valid. |
|
Anda tidak memiliki izin untuk mengekspor kunci. Artinya, ketika kunci hKey dibuat, bendera CRYPT_EXPORTABLE tidak ditentukan. |
|
Jenis BLOB kunci yang ditentukan oleh dwBlobType adalah PUBLICKEYBLOB, tetapi hExpKey tidak berisi handel kunci publik. |
|
Parameter dwBlobType menentukan jenis BLOB yang tidak diketahui. |
|
Konteks CSP yang ditentukan ketika kunci hKey dibuat tidak dapat ditemukan. |
|
Kunci sesi sedang diekspor, dan parameter hExpKey tidak menentukan kunci publik. |
Keterangan
Untuk salah satu permutasi kunci DES yang menggunakan PLAINTEXTKEYBLOB, hanya ukuran kunci penuh, termasuk bit paritas, yang dapat diekspor. Ukuran kunci berikut didukung.
Algoritma | Ukuran kunci yang didukung |
---|---|
CALG_DES | 64 bit |
CALG_3DES_112 | 128 bit |
CALG_3DES | 192 bit |
Contoh
Contoh berikut menunjukkan cara mengekspor kunci kriptografi atau pasangan kunci dengan cara yang lebih aman. Contoh ini mengasumsikan bahwa konteks kriptografi telah diperoleh dan bahwa kunci publik tersedia untuk diekspor. Untuk contoh yang menyertakan konteks lengkap untuk menggunakan fungsi ini, lihat Contoh Program C: Menandatangani Hash dan Memverifikasi Tanda Tangan Hash. Untuk contoh lain yang menggunakan fungsi ini, lihat Contoh Program C: Mengekspor Kunci Sesi.
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
BOOL GetExportedKey(
HCRYPTKEY hKey,
DWORD dwBlobType,
LPBYTE *ppbKeyBlob,
LPDWORD pdwBlobLen)
{
DWORD dwBlobLength;
*ppbKeyBlob = NULL;
*pdwBlobLen = 0;
// Export the public key. Here the public key is exported to a
// PUBLICKEYBLOB. This BLOB can be written to a file and
// sent to another user.
if(CryptExportKey(
hKey,
NULL,
dwBlobType,
0,
NULL,
&dwBlobLength))
{
printf("Size of the BLOB for the public key determined. \n");
}
else
{
printf("Error computing BLOB length.\n");
return FALSE;
}
// Allocate memory for the pbKeyBlob.
if(*ppbKeyBlob = (LPBYTE)malloc(dwBlobLength))
{
printf("Memory has been allocated for the BLOB. \n");
}
else
{
printf("Out of memory. \n");
return FALSE;
}
// Do the actual exporting into the key BLOB.
if(CryptExportKey(
hKey,
NULL,
dwBlobType,
0,
*ppbKeyBlob,
&dwBlobLength))
{
printf("Contents have been written to the BLOB. \n");
*pdwBlobLen = dwBlobLength;
}
else
{
printf("Error exporting key.\n");
free(*ppbKeyBlob);
*ppbKeyBlob = NULL;
return FALSE;
}
return TRUE;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows XP [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2003 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | wincrypt.h |
Pustaka | Advapi32.lib |
DLL | Advapi32.dll |