2017-02-03 24 views
0

Моя проблема заключается в том, что с UWP-приложениями я не могу использовать RSACryptoServiceProvider. Это означает, что я должен использовать CryptographicEngine для en/decrypt данных. Как я могу импортировать свой общедоступный/закрытый ключ в AsymmetricKeyAlgorithmProvider's ImportKeyPair -Method? Как мне создать параметр IBuffer? У меня есть два Pem или альтернативные xml-файлы, один для Private и один для открытого ключа, который я хочу использовать для en/decryption. Они создаются извне.AsymmetricKeyAlgorithmProvider Import

Я уже нашел решение с Chilkat's Rsa Класс. К сожалению, это не бесплатное ПО. Альтернативы?

Спасибо!

ответ

0

Как я могу импортировать свой общедоступный/закрытый ключ в асимметричныйKeyAlgorithmProvider's ImportKeyPair-Method? Как мне создать параметр IBuffer?

В сервере вы все равно можете использовать общий RSACryptoServiceProvider для возврата publickey и publickey.

System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.FromXmlString(xmlPrivatelKey); 
byte[] data1 = rsa.ExportCspBlob(false); 
byte[] data2 = rsa.ExportCspBlob(true); 

string pubkey = System.Convert.ToBase64String(data1); 
string privKey = System.Convert.ToBase64String(data2); 

В UWP приложениях, вы можете использовать AsymmetricKeyAlgorithmProvider для шифрования и дешифрования данных.

public static byte[] Encrypt(byte[] data, string publicKey) 
{ 
    IBuffer buffer = WindowsRuntimeBufferExtensions.AsBuffer(data, 0, data.Length); 
    AsymmetricKeyAlgorithmProvider asymmetricAlgorithm = AsymmetricKeyAlgorithmProvider.OpenAlgorithm("RSA_PKCS1"); 
    try 
    { 
     CryptographicKey key = asymmetricAlgorithm.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(publicKey), CryptographicPublicKeyBlobType.Capi1PublicKey); 
     IBuffer encrypted = CryptographicEngine.Encrypt(key, buffer, null); 
     return encrypted.ToArray(); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.StackTrace); 
     return new byte[0]; 
    } 
} 

public static byte[] Decrypt(byte[] data, string publicKey, string privateKey) 
{ 
    IBuffer buffer = WindowsRuntimeBufferExtensions.AsBuffer(data, 0, data.Length); 

    AsymmetricKeyAlgorithmProvider asymmetricAlgorithm = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 
    try 
    { 
     CryptographicKey pubkey = asymmetricAlgorithm.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(publicKey), CryptographicPublicKeyBlobType.Capi1PublicKey); 
     CryptographicKey keyPair2 = asymmetricAlgorithm.ImportKeyPair(CryptographicBuffer.DecodeFromBase64String(privateKey), CryptographicPrivateKeyBlobType.Capi1PrivateKey); 
     IBuffer decrypted = CryptographicEngine.Decrypt(keyPair2, buffer, null); 
     return decrypted.ToArray(); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.StackTrace); 
     return new byte[0]; 
    } 
} 
+0

Спасибо, я постараюсь как можно скорее! –