好的,所以简单的答案是:没有开箱即用的。如果您想要一个可以在所有这些平台上运行的库,则需要找到第三方库。微软没有提供。
话虽如此,仍然有一种方法可以使您的业务逻辑仍然可以是无平台的(例如在 PCL 中),同时仍然可以利用特定于平台的加密方法。这是使用依赖注入和控制反转(IoC)。
基本上,创建一个ICryptoController
类。此类将定义您想要执行的所有加密功能。如果要执行 AES 函数,请创建方法:
Task<byte[]> AesEncrypt(byte[] key, byte[] data, byte[] iv);
Task<byte[]> AesDecrypt(byte[] key, byte[] data, byte[] iv);
我应该注意,我建议使用字节数组 (byte[]) 作为返回值和输入值,因为它们是跨平台的,而 WP8 和 Win8 上的 IBuffers 则不是。
然后,您要做的是ServiceLocator
在 PCL 中创建一个包含static
可访问ICryptoController
属性的类。
在每个平台上,创建一个CryptoController
实现ICryptoController
. 然后,它使用特定于平台的实现覆盖每个加密函数。WPF 可以使用 System.Security。Windows 应用商店应用程序将使用 SymmetricAlgorithmProvider 等。
(例如,如果您查找它,Rfc2898DeriveBytes 实际上只是 PBKDF2,基于密码的密钥派生函数 2。Windows Store 通过KeyDerivationAlgorithmProvider
该类提供了执行此操作的功能。此处有执行此操作的指南。)
在每个平台上的每个应用程序开始时,将您的属性值设置为ServiceLocator
特定于平台的版本。您的 PCL 类现在可以免费访问特定于平台的加密算法实现。
那里有很多服务定位器库。Ninject 就是其中之一,尽管还有很多其他的。例如,一个包含在 MvvmLight 中。它们将使实现变得非常容易(尽管并不是特别难)。
希望这对编码有所帮助和快乐!
最后一点,我知道有些人试图通过 BouncyCastle 移植到不同的平台。我还没有找到一个实现Portable
。如果你想减少必须学习的加密系统的数量,你可能想看看你需要多少这些系统有一个你可以信任的可行的 BouncyCastle 实现。例如,我相信有两个可用于 Win8,尽管我不能保证它们的作者。