Použití šifrovaných modelů s Windows ML

Pro třídu LearningModel můžeme použít několik statických metod, které načítají modely strojového učení, jako je načtení modelu ze souboru v aplikaci, ze souboru na disku nebo načtení modelu ze streamu.

Načítání z metody streamu umožňuje lepší kontrolu nad modelem. V tomto případě můžete zvolit, že model bude šifrovaný na disku a dešifruje ho pouze v paměti před voláním jedné z metod LoadFromStream.

V tomto kurzu se dozvíte, jak integrovat šifrovaný model strojového učení s aplikací Windows ML (C#).

Rozhraní API pro Windows ML neposkytují službu šifrování strojového učení a nebudou zodpovídán za žádné škody nebo ztráty jakéhokoli druhu.

Získání modelu ONNX

V tomto kurzu použijete model SqueezeNet ve formátu ONNX k provedení šifrování, dešifrování a načtení ze streamu.

Stáhněte nebo naklonujte ukázkovou aplikaci Pro detekci objektů SqueezeNet z GitHubu a získejte model SqueezeNet.onnx.

Zadání požadovaných deklarací a proměnných

  1. Pomocí deklarací příkazů zkopírujte následující příkazy, abyste získali přístup ke všem rozhraním API, která budete potřebovat:
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;

Pro klíč a inicializační vektor definujete dvě speciální proměnné.

Klíč je proměnná třídy CryptographicKey, která představuje symetrický (nebo asymetrický) pár klíčů. Budete potřebovat objekt z této třídy, protože použijete metodu AsymmetricKeyAlgorithmProvider k vytvoření nebo importu klíčů.

Inicializační vektor je proměnná třídy IBuffer, která představuje pole bajtů používané rozhraními pro čtení a zápis bajtového proudu.

Obě proměnné třídy CryptographicKey a IBuffer se používají k šifrování a dešifrování datového proudu.

  1. Přidejte následující deklarace proměnných a třídu MainPage za příkazy using uvnitř oboru názvů crypto:
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();
        }
    }
}

Šifrování modelu

Rozhraní API systému Windows poskytují bohatou sadu funkcí a možností, které můžou vylepšit funkce sady rozhraní WINDOWS ML API. V této části použijete službu šifrování a dešifrování, která je součástí rozhraní API systému Windows, k vytvoření datového proudu v paměti a k načtení modelu z tohoto datového proudu použijete rozhraní API systému Windows ML.

K šifrování modelu strojového učení můžete použít libovolnou službu šifrování podle vašich požadavků. V tomto kurzu použijeme metodu šifrování – SymmetricAlgorithmNames - .AesCbcPkcs7.

Třída SymmetricAlgorithmNames pomáhá načíst algoritmy symetrického klíče pro použití symetrického šifrování klíče ve vašem modelu. Tento typ šifrování vyžaduje, aby se k dešifrování použil stejný klíč, který se používá pro šifrování.

SymmetricKeyAlgorithmProvider Pomocí třídy můžete vybrat algoritmus a vytvořit klíč. V tomto kurzu použijeme .AesCbcPkcs7. algoritmus.

Tento AES_CBC_PKCS7 algoritmus představuje pokročilý algoritmus Advanced Encryption Standard (AES) v kombinaci s režimem řetězení bloků šifer a vyplněním PKCS#7.

  1. Následující kód ukazuje, jak vygenerovat klíč a šifrovat 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;
}

[POZNÁMKA!] Zajímá vás další informace o kryptografických klíčích? Projděte si dokumentaci k kryptografickým klíčům.

Dešifrování modelu a načtení ze streamu

Před načtením modelu ho musíte dešifrovat pomocí metody CryptographicEngine.Decrypt. CryptographicEngine.Decrypt je metoda dešifrování obsahu, který byl dříve zašifrován pomocí symetrického nebo asymetrického algoritmu. Při volání metody budete muset zadat dříve vygenerovaný klíč.

Pro přístup k dešifrovaného modelu použijete InMemoryRandomAccessStream třídu, která poskytuje náhodný přístup k datům ve vstupních a výstupních datových proudech uložených v paměti místo na disku.

V posledním kroku vytvoříte relaci, která načte model z datového proudu, a to pomocí metody LearningModel.LoadFromStreamAsync. Tuto metodu můžete použít jako synchronní nebo asynchronní úkol.

Následující kód ukazuje, jak dešifrovat model pomocí vygenerovaného klíče, zapsat ho do datového proudu a pak model načíst ze streamu.

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);
}

Spuštění modelu

Zkopírujte následující metodu Run, která volá metody definované dříve.

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);
}

Shrnutí

A je to. Model jste úspěšně nahráli do aplikace Windows ML.

Po načtení modelu můžete pokračovat v vytváření relace, svázat vstupy a výstupy modelu a vyhodnotit model a dokončit aplikaci Windows ML.

Další zdroje

Další informace o tématech uvedených v tomto kurzu najdete v následujících zdrojích informací: