Pengodean Data yang Ditandatangani
Data yang ditandatangani terdiri dari konten apa pun dan hash pesan terenkripsi dari konten dengan nol atau lebih penanda tangan. Hash yang dihasilkan dapat mengonfirmasi bahwa pesan asli belum dimodifikasi sejak ditandatangani dan orang atau entitas tertentu menandatangani data.
Ilustrasi berikut menggambarkan prosedur untuk mengodekan pesan yang ditandatangani. Daftar yang mengikuti ilustrasi menjelaskan langkah-langkahnya.
Pesan mungkin memiliki beberapa penanda tangan, algoritma hash, dan sertifikat. Sementara ilustrasi hanya menunjukkan sertifikat, CRL, dan CCL yang dapat menggunakan proses yang sama. Mereka akan sesuai dengan ilustrasi di mana pun sertifikat ditampilkan.
Proses umum untuk pengodean Data yang Ditandatangani adalah sebagai berikut.
Untuk mengodekan data yang ditandatangani
- Data dibuat (jika perlu), dan pointer ke dalamnya diambil.
- Penyimpanan sertifikat dibuka yang berisi sertifikat penanda tangan.
- Kunci privat untuk sertifikat diambil. Ada dua properti yang harus diatur pada sertifikat sebelum menggunakannya. Satu digunakan untuk mengikat sertifikat ke CSP tertentu dan, dalam CSP tersebut, ke kontainer kunci privat tertentu. Yang lain digunakan untuk menunjukkan algoritma hash mana yang akan digunakan ketika operasi hash dipanggil. Ini hanya perlu diatur sekali.
- Properti sertifikat menentukan algoritma hash.
- Hash data dibuat dengan mengirim data melalui fungsi hashing.
- Tanda tangan dibuat dengan mengenkripsi hash menggunakan kunci privat, yang diperoleh melalui properti pada sertifikat.
- Data berikut disertakan dalam pesan yang sudah selesai dan ditandatangani:
- Data asli yang akan ditandatangani
- Algoritma hash
- Tanda tangan
- Struktur info penanda tangan, yang mencakup pengidentifikasi penanda tangan (penerbit sertifikat dan nomor seri)
- Sertifikat penanda tangan (opsional)
Prosedur ini menggambarkan kasus sederhana. Kasus yang lebih kompleks melibatkan atribut terautentikasi yang disertakan dalam pesan. Ketika jenis konten apa pun kecuali string BYTE , atau setidaknya ada satu atribut terautentikasi bersama dengan jenis data apa pun, ada dua atribut terautentikasi standar yang diperlukan: jenis konten (data), dan hash konten. Dalam keadaan ini, CryptoAPI secara otomatis menyediakan dua atribut yang diperlukan ini. Fungsi pesan tingkat rendah mem-hash atribut yang diautentikasi, mengenkripsi hash dengan kunci privat, dan memberikan ini sebagai tanda tangan.
Gunakan fungsi pesan tingkat rendah untuk menyelesaikan tugas yang baru saja dicantumkan, dengan menggunakan prosedur berikut.
Untuk mengodekan pesan yang ditandatangani
Membuat atau mengambil konten.
Dapatkan penyedia kriptografi.
Dapatkan sertifikat penanda tangan.
Menginisialisasi struktur CMSG_SIGNER_ENCODE_INFO .
Menginisialisasi struktur CMSG_SIGNED_ENCODE_INFO .
Panggil CryptMsgCalculateEncodedLength untuk mendapatkan ukuran BLOB pesan yang dikodekan. Alokasikan memori untuk itu.
Panggil CryptMsgOpenToEncode, meneruskan CMSG_SIGNED untuk dwMsgType dan penunjuk ke CMSG_SIGNED_ENCODE_INFOpvMsgEncodeInfo untuk mendapatkan handel ke pesan yang dibuka.
Panggil CryptMsgUpdate, meneruskan handel yang diambil di langkah 7, dan pointer ke data yang akan ditandatangani dan dikodekan. Fungsi ini dapat dipanggil sebanyak yang diperlukan untuk menyelesaikan proses pengodean.
Panggil CryptMsgGetParam, meneruskan handel yang diambil di langkah 7 dan jenis parameter yang sesuai untuk mengakses data yang diinginkan dan dikodekan. Misalnya, teruskan CMSG_CONTENT_PARAM untuk mendapatkan pointer ke seluruh pesan PKCS #7 .
Jika hasil pengodean ini akan digunakan sebagai data dalam untuk pesan lain yang dikodekan, seperti pesan yang diselimuti, parameter CMSG_BARE_CONTENT_PARAM harus diteruskan. Untuk contoh yang menunjukkan ini, lihat Kode Alternatif untuk Mengodekan Pesan Yang Diselimuti.
Tutup pesan dengan memanggil CryptMsgClose.
Hasil dari prosedur ini adalah pesan yang dikodekan yang berisi data asli, hash terenkripsi dari data tersebut (tanda tangan), dan informasi penanda tangan. Ada juga pointer ke BLOB yang diinginkan dan dikodekan.
Untuk detail pengodean C, lihat Contoh Program C: Menandatangani, Mengodekan, Mendekode, dan Memverifikasi Pesan.