Menggunakan model terenkripsi dengan Windows ML

Ada beberapa metode statis yang dapat kita terapkan pada kelas LearningModel untuk memuat model pembelajaran mesin seperti memuat model dari file di aplikasi Anda, dari file di disk atau memuat model dari aliran.

Memuat dari metode streaming memungkinkan kontrol yang lebih baik atas model. Dalam hal ini, Anda dapat memilih untuk mengenkripsi model pada disk dan mendekripsinya hanya dalam memori sebelum memanggil salah satu metode LoadFromStream.

Dalam tutorial ini, Anda akan mempelajari cara mengintegrasikan model pembelajaran mesin terenkripsi dengan aplikasi Windows ML (C#).

API ML Windows tidak menyediakan layanan enkripsi pembelajaran mesin dan tidak akan bertanggung jawab atas kerusakan atau kehilangan apa pun.

Mendapatkan model ONNX

Dalam tutorial ini, Anda akan menggunakan model SqueezeNet dalam format ONNX untuk melakukan enkripsi, dekripsi, dan pemuatan dari aliran.

Unduh atau kloning aplikasi sampel Deteksi Objek SqueezeNet dari GitHub untuk mendapatkan model SqueezeNet.onnx.

Tentukan deklarasi dan variabel yang diperlukan

  1. Salin deklarasi pernyataan using di bawah ini untuk mendapatkan akses ke semua API yang Anda perlukan.
using System;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Controls;

Anda akan menentukan dua variabel khusus untuk kunci dan vektor inisialisasi.

Kuncinya adalah variabel kelas CryptographicKey, yang mewakili pasangan kunci simetris (atau asimetris). Anda akan memerlukan objek dari kelas ini karena Anda akan menggunakan AsymmetricKeyAlgorithmProvider metode untuk membuat atau mengimpor kunci.

Vektor inisialisasi adalah variabel dari kelas IBuffer, yang mewakili sebuah array byte yang dirujuk dan digunakan oleh antarmuka untuk pembacaan dan penulisan aliran byte.

Variabel kelas CryptographicKey dan IBuffer digunakan untuk mengenkripsi dan mendekripsi aliran.

  1. Tambahkan deklarasi variabel berikut dan kelas MainPage setelah pernyataan using di dalam namespace kripto.
namespace crypto
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        private CryptographicKey _key;
        private IBuffer _initialization_vector;
        public MainPage()
        {
            this.InitializeComponent();

            Run();
        }
    }
}

Enkripsi Model

API Windows menyediakan serangkaian fitur dan kemampuan yang kaya, yang dapat meningkatkan fungsionalitas set API Windows ML. Di sini, Anda akan menggunakan layanan enkripsi dan dekripsi yang disediakan di set API Windows untuk menghasilkan aliran dalam memori, dan menggunakan API Windows ML untuk memuat model dari aliran tersebut.

Anda dapat menggunakan layanan enkripsi apa pun untuk mengenkripsi model pembelajaran mesin Anda, sesuai kenyamanan Anda. Dalam tutorial ini, kita akan menggunakan metode enkripsi – SymmetricAlgorithmNames - .AesCbcPkcs7.

Kelas SymmetricAlgorithmNames membantu Anda mengambil algoritma kunci konten untuk menerapkan enkripsi kunci konten pada model Anda. Jenis enkripsi ini mengharuskan kunci yang sama yang digunakan untuk enkripsi juga digunakan untuk dekripsi.

Dengan menggunakan kelas , SymmetricKeyAlgorithmProvider Anda dapat memilih algoritma dan membuat kunci Anda. Dalam tutorial ini, kita akan menggunakan .AesCbcPkcs7. algoritma.

AES_CBC_PKCS7 Algoritma mewakili algoritma Standar Enkripsi lanjutan (AES), ditambah dengan mode operasi rantai blok sandi dan padding PKCS#7.

  1. Kode di bawah ini menunjukkan cara membuat kunci dan mengenkripsi model.
async Task<IBuffer> EncryptAsync(StorageFile model_file)
{
	// get a buffer for the model file
	var file_buffer = await Windows.Storage.FileIO.ReadBufferAsync(model_file);

	// set up the encryption algorithm
	var algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
	uint key_length = 32;
	var key_buffer = CryptographicBuffer.GenerateRandom(key_length);
	_key = algorithm.CreateSymmetricKey(key_buffer);
	_initialization_vector = CryptographicBuffer.GenerateRandom(algorithm.BlockLength);

	// perform the encryption
	var encrypted_buffer = CryptographicEngine.Encrypt(_key, file_buffer, _initialization_vector);

	return encrypted_buffer;
}

[CATATAN!] Tertarik untuk mempelajari lebih lanjut tentang Kunci Kriptografi? Harap tinjau dokumentasi Kunci kriptografi.

Mendekripsi Model dan Memuat dari aliran

Sebelum memuat model, Anda perlu mendekripsinya menggunakan metode CryptographicEngine.Decrypt. CryptographicEngine.Decrypt adalah metode untuk mendekripsi konten yang sebelumnya dienkripsi dengan menggunakan algoritma simetris atau asimetris. Saat memanggil metode , Anda harus memberikan kunci yang dihasilkan sebelumnya.

Untuk mengakses model yang didekripsi, Anda akan menggunakan InMemoryRandomAccessStream kelas , yang menyediakan akses acak data dalam aliran input dan output yang disimpan dalam memori alih-alih pada disk.

Sebagai langkah terakhir, Anda akan membuat sesi untuk memuat model dari stream, menggunakan metode LearningModel.LoadFromStreamAsync. Anda dapat memanggil metode ini sebagai tugas sinkron atau asinkron.

Kode di bawah ini menunjukkan cara mendekripsi model menggunakan kunci yang dihasilkan, menulisnya ke aliran, lalu memuat model dari aliran.

async Task DecryptAndRunAsync(IBuffer encryptyed_buffer)
{
	// decrypt the buffer
	var decrypted_buffer = CryptographicEngine.Decrypt(_key, encryptyed_buffer, _initialization_vector);

	// write it to a stream
	var decrypted_stream = new InMemoryRandomAccessStream();
	await decrypted_stream.WriteAsync(decrypted_buffer);

	// load the model from the stream
	var model = await LearningModel.LoadFromStreamAsync(RandomAccessStreamReference.CreateFromStream(decrypted_stream));

	// create a session
	var session = new LearningModelSession(model);
}

Menjalankan model

Salin metode Jalankan berikut untuk memanggil metode yang ditentukan sebelumnya.

async Task Run()
{

	// get the model file
	var model_file = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/SqueezeNet.onnx"));

	// encrypt the model file.
	var encryptyed_buffer = await EncryptAsync(model_file);

	// decrypt the model file and load it
	await DecryptAndRunAsync(encryptyed_buffer);
}

Ringkasan

Itu saja! Anda telah berhasil memuat model ke aplikasi Windows ML Anda.

Setelah memuat model, Anda dapat terus membuat sesi, mengikat input dan output model, dan mengevaluasi model untuk menyelesaikan aplikasi Windows ML Anda.

Sumber Daya Tambahan

Untuk mempelajari selengkapnya tentang topik yang disebutkan dalam tutorial ini, kunjungi sumber daya berikut: