2010-08-11 4 views
1

J'ai besoin de traduire le code suivant en C# à partir de PHP. Quelles bibliothèques/espaces de noms dois-je utiliser?Comment puis-je porter openssl_sign de php en C#?

function sign($method, $uuid, $data) { 
    $merchant_private_key = openssl_get_privatekey(file_get_contents('merchant_private_key.pem')); 
    $plaintext = $method . $uuid . serialize_data($data); 
    **openssl_sign($plaintext, $signature, $merchant_private_key);** 
    return base64_encode($signature); 
} 

Le api se trouve sur à http://php.net/manual/en/function.openssl-sign.php. Où est-ce que je commence? Je n'ai aucune idée de ce que fait le php open_ssl en php derrière les couvertures. Toute personne capable de donner un coup de main qui connaît à la fois php et C# ou quelqu'un pourrait au moins expliquer ce que openssl_sign fait en arrière-plan pour que je puisse le porter.

EDIT: 2010-08-18 Je ne trouve pas un moyen d'utiliser openssl, il n'arrête pas de dire qu'il ne peut pas charger managedopenssl.dll. Je pense que c'est parce que ma machine est x64.

Répondre

1

Merci pour vos suggestions.

J'ai trouvé une solution à mes problèmes. Il y a une bibliothèque appelée ChilKat que nous utiliserons. La réponse a été trouvée here. Malheureusement, cela ne fonctionne pas sur ma machine x64. Heureusement, nos serveurs sont toujours x86, donc nous avons plus de temps pour trouver une solution de contournement.

1

La difficulté consiste ici à lire et décoder la clé privée. Vous pouvez utiliser le following openssl helper class. Une fois que vous avez fait référence il vous pouvez essayer ceci:

public static string Sign(string method, string uuid, string data) 
{ 
    string merchantPrivateKey = File.ReadAllText("merchant_private_key.pem"); 
    byte[] der = opensslkey.DecodePkcs8PrivateKey(merchantPrivateKey); 
    using (RSACryptoServiceProvider rsa = opensslkey.DecodePrivateKeyInfo(der)) 
    using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) 
    { 
     // This will contain the data to sign 
     byte[] dataToSign = Encoding.Default.GetBytes(method + uuid + data); 
     byte[] signature = rsa.SignData(dataToSign, md5); 
     return Convert.ToBase64String(signature); 
    } 
} 

Dans cet exemple, je l'ai utilisé MD5 mais vous pouvez utiliser tout ce qui est approprié à votre scénario. Je pense que openssl_sign utilise SHA1 par défaut.

+0

Merci pour cette suggestion! Malheureusement, je rencontre des problèmes avec openssl, je pense que cela a à voir avec ma machine étant x64. Impossible de trouver openssl.net pour x64 non plus. – mhenrixon

+1

@CatZ: Vous pouvez forcer l'application à s'exécuter en mode 32 bits via les options de compilation. Cela devrait lui permettre d'exécuter des DLL 32 bits. – Powerlord

+1

@CatZ: Alternativement, il existe des versions Win64 d'OpenSSL sur cette page: http://www.slproweb.com/products/Win32OpenSSL.html – Powerlord

Questions connexes