2015-03-20 3 views
1

Я пытаюсь создать ключи с пакетом python ecdsa, экспортировать его в der и использовать их с BouncyCastle под .Net (и наоборот).Создайте ключи с помощью python и используйте их в .net

Это мой код в Python:

import base64 
from ecdsa.keys import SigningKey 
from ecdsa.curves import NIST521p, NIST384p, NIST256p 

@classmethod 
def CreateKey(self) -> SigningKey: 
    privateKey = SigningKey.generate(NIST256p) 
    return privateKey 

@classmethod  
def GetPublicKey(self, privateKey: SigningKey) -> str: 
    publicKey = privateKey.get_verifying_key() 
    der = publicKey.to_der() 
    return base64.b64encode(der) 

Я получаю две строки, которые я хочу импортировать в .Net:

 Const plainDerBase64Pub = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyJW32bO4wswhE9ZC5klCjRNDJQSB0lIBphe9wIa/W2n3fBJ0cDpSpy9qlq2L6sa4W5lgRHYD9IyfETom6YOH/g==" 
    Const plainDerBase64Priv = "MHcCAQEEIKjIPCG9CGMunu34jXnDZg1LmNYrcJo8EqzKbRu2E24MoAoGCCqGSM49AwEHoUQDQgAEyJW32bO4wswhE9ZC5klCjRNDJQSB0lIBphe9wIa/W2n3fBJ0cDpSpy9qlq2L6sa4W5lgRHYD9IyfETom6YOH/g==" 

    Dim keyPriv = PrivateKeyFactory.DecryptKey({}, Base64.Decode(plainDerBase64Priv)) 
    Dim keyPub = PrivateKeyFactory.DecryptKey({}, Base64.Decode(plainDerBase64Pub)) 

Но я получаю исключение:

Test method LicenseProtectorTest.KeyManagementTest.ImportKeyFromPythonTest threw exception: 
System.ArgumentException: Wrong number of elements in sequence 
Parametername: seq 
Result StackTrace: 
bei Org.BouncyCastle.Asn1.Pkcs.EncryptedPrivateKeyInfo..ctor(Asn1Sequence seq) in C:\BouncyCastle\crypto\src\asn1\pkcs\EncryptedPrivateKeyInfo.cs:Zeile 18. 
    bei Org.BouncyCastle.Asn1.Pkcs.EncryptedPrivateKeyInfo.GetInstance(Object obj) in C:\BouncyCastle\crypto\src\asn1\pkcs\EncryptedPrivateKeyInfo.cs:Zeile 42. 
    bei Org.BouncyCastle.Security.PrivateKeyFactory.DecryptKey(Char[] passPhrase, Asn1Object asn1Object) in C:\BouncyCastle\crypto\src\security\PrivateKeyFactory.cs:Zeile 196. 
    bei Org.BouncyCastle.Security.PrivateKeyFactory.DecryptKey(Char[] passPhrase, Byte[] encryptedPrivateKeyInfoData) in C:\BouncyCastle\crypto\src\security\PrivateKeyFactory.cs:Zeile 182. 
    bei LicenseProtectorTest.KeyManagementTest.ImportKeyFromPythonTest() in ... 

Любая идея, что я делаю неправильно здесь?

ответ

2

Я не знаком с библиотекой питона, но я был в состоянии догадаться, в форматах и ​​следующий код будет анализировать данные Пример:

using System; 

using Org.BouncyCastle.Asn1.Sec; 
using Org.BouncyCastle.Asn1.X9; 
using Org.BouncyCastle.Crypto.Parameters; 
using Org.BouncyCastle.Security; 
using Org.BouncyCastle.Utilities.Encoders; 

namespace BCTests 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      var plainDerBase64Pub = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyJW32bO4wswhE9ZC5klCjRNDJQSB0lIBphe9wIa/W2n3fBJ0cDpSpy9qlq2L6sa4W5lgRHYD9IyfETom6YOH/g=="; 
      var plainDerBase64Priv = "MHcCAQEEIKjIPCG9CGMunu34jXnDZg1LmNYrcJo8EqzKbRu2E24MoAoGCCqGSM49AwEHoUQDQgAEyJW32bO4wswhE9ZC5klCjRNDJQSB0lIBphe9wIa/W2n3fBJ0cDpSpy9qlq2L6sa4W5lgRHYD9IyfETom6YOH/g=="; 

      var pubKeyBytes = Base64.Decode(plainDerBase64Pub); 
      var privKeyBytes = Base64.Decode(plainDerBase64Priv); 

      var pubKey = PublicKeyFactory.CreateKey(pubKeyBytes); 

      var privKeyStruct = ECPrivateKeyStructure.GetInstance(privKeyBytes); 
      var x9 = ECNamedCurveTable.GetByName("P-256"); 
      var ec = new ECDomainParameters(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed()); 
      var privKey = new ECPrivateKeyParameters(privKeyStruct.GetKey(), ec); 
     } 
    } 
} 

Публичных и privKey затем ECPublicKeyParameters и ECPrivateKeyParameters, что вы может использоваться с различными алгоритмами.

Обратите внимание, что DER - это кодировка, а не формат. Для открытого ключа код python создает SubjectPublicKeyInfo, который является стандартным форматом X.509 для открытых ключей.

Должна быть опция с закрытым ключом генерации PrivateKeyInfo (или EncryptedPrivateKeyInfo с использованием пароля), оба из которых являются форматами из стандарта PKCS # 8. Если код python может вывести один из них, то расшифровать закрытый ключ будет проще, чем просто PrivateKeyFactory.CreateKey (байты) или .DecryptKey (пароль, байты).

+0

Я не пробовал код, поскольку теперь я использую mono для запуска приложения .net на сервере (что делает тот же самый python раньше), но это выглядит очень хорошо. – habakuk