2010-04-19 6 views
-6

J'ai ce code php et je voudrais obtenir l'équivalent exact C#Convertir ce code PHP en C# Rijndael algorithme

$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); 
$encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_192, $key, $salt . $message . $nonce, MCRYPT_MODE_CBC, $iv); 
$base64Data = base64_encode($salt . $iv . $encryptedData); 
$urlEncodedData = rawurlencode($base64Data); 

Toutes les contributions reçues avec gratitude!

+0

J'ai vu d'autres questions du même type demandant la même aide et répondu avec gentillesse et bonne humeur, qu'est-ce qui ne va pas avec cette question? – Rob

+0

@Vecdid essayez d'abord de lire les questions, puis vous verrez pourquoi elles n'ont pas été répondues. – Rob

+1

@Rob J'ai fait, beaucoup de réponses upvoted. Juste vous donner des conseils, prendre ou laisser, bonne chance à résoudre votre problème et passez une bonne journée! –

Répondre

0

sayers et fauteurs de malheur, voilà!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 
using System.Web; 

namespace EncryptData 
{ 
    class EncryptData 
    { 
    private static readonly Encoding ASCII_ENCODING = new System.Text.ASCIIEncoding(); 

    private static string md5(string text) 
    { 
     return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCII_ENCODING.GetBytes(text))).Replace("-", "").ToLower(); 
    } 

    public abstract string nonce(); 

    public abstract string salt(); 

    public readonly string EncryptedData; 

    public EncryptData(string message) 
    { 

     // set up encrytion object 
     RijndaelManaged aes192 = new RijndaelManaged(); 
     aes192.KeySize = 192; 
     aes192.BlockSize = 192; 
     aes192.Padding = PaddingMode.None; 
     aes192.Mode = CipherMode.CBC; 
     aes192.Key = ASCII_ENCODING.GetBytes(md5(SECRET_KEY)); 
     aes192.GenerateIV(); 

     string localSalt = salt(); 
     string localNonce = nonce(); 

     // form the string for encrypting 
     // and put into byte array 
     string textToEncrypt = localSalt + message+ localNonce; 
     byte[] plainTextBytes = ASCII_ENCODING.GetBytes(textToEncrypt); 

     // encrypt the data    
     ICryptoTransform encryptor = aes192.CreateEncryptor(); 
     MemoryStream ms = new MemoryStream(); 

     CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write); 
     cs.Write(plainTextBytes, 0, plainTextBytes.Length); 

     // convert our encrypted data from a memory stream into a byte array. 
     byte[] cypherTextBytes = ms.ToArray(); 

     // close memory stream 
     ms.Close(); 

     byte[] combined = null; 
     // combine data and convert to byte array 
     combined = CombinedData(localSalt, aes192.IV, cypherTextBytes); 
     // url encode data once converted to base64 string 
     EncryptedData = HttpUtility.UrlEncode(base64CombinedData(combined), ASCII_ENCODING); 


    } 

    public byte[] CombinedData(string salt, byte[] IV, byte[] cypherTextBytes) 
    { 
     // convert salt string into byte array 
     byte[] saltBytes = ASCII_ENCODING.GetBytes(salt); 

     // catenate all the byte arrays into one 
     // set up dest byte array with required size 
     byte[] rv = new byte[saltBytes.Length + IV.Length + cypherTextBytes.Length]; 

     // copy in each byte array 
     Buffer.BlockCopy(saltBytes, 0, rv, 0, saltBytes.Length); 
     Buffer.BlockCopy(IV, 0, rv, saltBytes.Length, IV.Length); 
     Buffer.BlockCopy(cypherTextBytes, 0, rv, saltBytes.Length + IV.Length, cypherTextBytes.Length); 

     return rv; 
    } 

    public string base64CombinedData(byte[] rv) 
    { 
     return Convert.ToBase64String(rv); 
    } 

} 
} 
3

Trop de variables à convertir directement; Je vous recommande d'examiner ce qu'il fait et de le réécrire en C# pour respecter l'intention du code original.

0

Désolé, mais pour être honnête, la question est plutôt stupide.

Tout ce code ne fait que crypter et encoder. PHP est plein de fonctions globales à partir de modules qui font la chose. Pour C# Vous devez trouver les libs/classes appropriées qui ont des méthodes de cryptage, etc. Il y aura probablement une logique et des paramètres différents. Je parie que vous aurez même des différences de sortie en raison de différentes implémentations.

Je suppose this est la chose la plus proche, vous trouverez une réponse à votre question

0

Dans l'exemple fourni par Rob je pense qu'il aurait dû utiliser PaddingMode.Zero au lieu de PaddingMode.None, comme cela est le mcrypt_encrypt() ajoute de façon rembourrages.