2014-01-08 95 views
1

我在使用PHP進行AES加密時遇到了一些問題,並使用C#對其進行解碼。我的參考文獻site使用C#進行加密從這些PHP代碼中進行AES加密和解密

這裏是PHP代碼:

function encrypt_string($input, $key) 
    { 
     $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND); 
     return preg_replace('/=/', "", base64_encode($iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128, hash("sha256", $key, true), $input, MCRYPT_MODE_CBC, $iv))); 
    } 

function decrypt_string($input, $key) 
    { 
     $input .= "="; 
     $data = base64_decode($input); 
     $iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); 
     return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,hash('sha256', $key, true),substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),MCRYPT_MODE_CBC,$iv),"\0"); 
    } 

這裏是我試過的C#代碼:

private static byte[] sha256_data(string input) 
{ 
    SHA256 hash = SHA256Managed.Create(); 
    Encoding encode = Encoding.UTF8; 
    return hash.ComputeHash(encode.GetBytes(input)); 
} 

private string encode_data(string data, string key) 
{ 
    byte[] buff; 

    RijndaelManaged rij = new RijndaelManaged(); 

    rij.BlockSize = 256; 
    rij.KeySize = 256; 

    rij.GenerateIV(); 
    rij.Key = sha256_data(key); 

    rij.Mode = CipherMode.CBC; 
    ICryptoTransform encoder = rij.CreateEncryptor(rij.Key, rij.IV); 
    using (MemoryStream mem = new MemoryStream()) 
    { 
     using (CryptoStream crypt = new CryptoStream(mem, encoder, CryptoStreamMode.Write)) 
     { 
      byte[] temp = Encoding.UTF8.GetBytes(data); 
      crypt.Write(temp, 0, temp.Length); 

     } 
     buff = mem.ToArray(); 
    } 
    return Convert.ToBase64String(result); 
} 

private string decode_data(string input, string key) 
{ 
    RijndaelManaged rij = new RijndaelManaged(); 

    rij.KeySize = 256; 
    rij.BlockSize = 256; 

    rij.Key = sha256_data(key); 
    rij.GenerateIV(); 

    rij.Mode = CipherMode.CBC; 
    rij.Padding = PaddingMode.PKCS7; 

    ICryptoTransform decrypter = rij.CreateDecryptor(); 

    byte[] buff; 
    using (MemoryStream mem = new MemoryStream()) 
    { 
     using (CryptoStream cstream = new CryptoStream(mem, decrypter, CryptoStreamMode.Write)) 
     { 
      byte[] data = Convert.FromBase64String(input); 
      cstream.Write(data, 0, data.Length); 
     } 
     buff = mem.ToArray(); 
    } 
    return Encoding.UTF8.GetString(buff); 
} 

我到底做錯了什麼?

回答

0

當你解碼你必須解析用於編碼的IV不會生成一個新的。

+0

有點代碼可以幫助我解決這個問題。儘管如此,我在這裏找到的代碼取得了更多進展 - http://codereview.stackexchange.com/questions/13714/symmetric-encryption-decryption-routine-using-aes –

相關問題