2016-11-21 9 views
0

Я пытаюсь разработать способ шифрования строки с использованием закрытого ключа и расшифровать ее с помощью общедоступного. Я создал ключи с помощью OpenSSL, как описано в:Кодирование/декодирование в UWP с использованием асимметричных клавиш

http://www.akadia.com/services/ssh_test_certificate.html

Это то, что я в настоящее время

public static string Encrypt(string str, string key) 
{ 
    try 
    { 
     key = key.Replace(Environment.NewLine, ""); 
     IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key); 

     AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 

     CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey); 
     IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str)); 
     var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null); 

     return CryptographicBuffer.EncodeToBase64String(encryptedData); 
    } 
    catch (Exception e) 
    { 
     throw; 
     return "Error in Encryption:With RSA "; 
    } 
} 

Однако на методе ImportPublicKey я получаю exceptin ASN1 corrupted data

строку key, переданный этому методу, имеет следующий формат:

var privateKey = 

@ "MIICXwIBAAKBgQDUTqfSknFiQx3aepORHJycWck007cfU4fXluTIyf6U9ipDhyPD .... yDxwZVmexltyK5Bwc26lmb + 5EtTEic + kZToYWcCucF8lsok =";

поэтому содержимое OpenSSL генерируется файл ключа без этой части:

-----BEGIN RSA PRIVATE KEY----- 
-----END RSA PRIVATE KEY----- 

ответ

0

Итак, мой код был довольно не так, как я хотел, чтобы зашифровать с помощью закрытого ключа, но использовал функцию ImportPublicKey, то правильный путь должен быть;

public static string Encrypt(string str, string key) 
{ 
    try 
    { 
     key = key.Replace(Environment.NewLine, ""); 
     IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key); 

     AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 

     var keyPar = provider.ImportKeyPair(keyBuffer, CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey); 
     //CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey); 
     IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str)); 
     var encryptedData = CryptographicEngine.Encrypt(keyPar, dataBuffer, null); 
     var encryptedStr = CryptographicBuffer.EncodeToBase64String(encryptedData); 
     var signature = CryptographicEngine.Sign(keyPar, dataBuffer); 
     var signatureStr = CryptographicBuffer.EncodeToBase64String(signature); 
     return encryptedStr; 
    } 
    catch (Exception e) 
    { 
     throw; 
     return "Error in Encryption:With RSA "; 
    } 
} 

, и это работает для шифрования строки с использованием секретного ключа RSA.

Однако, когда я пытаюсь расшифровать с помощью открытого ключа, используя следующий аналогичный метод;

public static string Decrypt(string str, string key) 
{ 
    try 
    { 
     key = key.Replace(Environment.NewLine, ""); 
     IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key); 

     AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaSignPkcs1Sha256); 

     CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo); 
     IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str)); 
     var encryptedData = CryptographicEngine.Decrypt(publicKey, dataBuffer, null); 
     return CryptographicBuffer.EncodeToBase64String(encryptedData); 
    } 
    catch (Exception e) 
    { 
     throw; 
     return "Error in Decryption:With RSA "; 
    } 
} 

Я получаю Method or operation not implemented исключение, либо есть еще что-то не так, или метод частного шифровать/расшифровывать общественного еще не существует в UWP.

Что я закончил делать, чтобы получить пакет NuGet Portable.BouncyCastle-Signed и следовать фрагмент кода из этого ответа:

C# BouncyCastle - RSA Encryption with Public/Private keys

работает как Шарме.

+1

Пожалуйста, используйте официальную портативную версию BouncyCastle, Portable.BouncyCastle. Я поддерживаю портативную вилку. Если у вас возникли проблемы, откройте проблему в репо: github.com/onovotny/bc-csharp –