2012-06-25 75 views
4

我正在尝试将C#函数转换为PHP。将c#Rijndael函数转换为php函数

这里是C#功能:

public string Encrypt(string Value) 
    { 
     string RetVal = ""; 
     if(Value != string.Empty && Value != null) 
     { 
      MemoryStream Buffer = new MemoryStream(); 
      RijndaelManaged RijndaelManaged = new RijndaelManaged(); 
      UnicodeEncoding UnicodeEncoder = new UnicodeEncoding(); 

      byte[] KeyArray = new Byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; 
      byte[] IVArray = new Byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };  
      try 
      { 
       byte[] ValueBytes = UnicodeEncoder.GetBytes(Value); 

       CryptoStream EncryptStream = new CryptoStream(Buffer, 
        RijndaelManaged.CreateEncryptor(KeyArray, IVArray), 
        CryptoStreamMode.Write); 

       EncryptStream.Write(ValueBytes, 0, ValueBytes.Length); 
       EncryptStream.FlushFinalBlock(); 

       // Base64 encode the encrypted data 
       RetVal = Convert.ToBase64String(Buffer.ToArray()); 
      } 
      catch 
      { 
       throw; 
      } 
     } 

     return RetVal; 
    } 

,这里是我的PHP的尝试:

function EncryptString ($cleartext) 
{ 

    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
    $key128 = '111111111111111111111111111'; 
    $iv = '111111111111111111111111111'; 

    if (mcrypt_generic_init($cipher, $key128, $iv) != -1) //Parameter iv will be ignored in ECB mode 
    { 
     $cipherText = mcrypt_generic($cipher,$cleartext); 
     mcrypt_generic_deinit($cipher);  
     $encrypted = (bin2hex($cipherText));  
     return base64_encode($encrypted); 
    } 
} 

目前,当我编码测试短语 “测试” 使用这两个功能,我得到不同的价值。它看起来像PHP版本需要一个字符串为$key$iv值,其中C#版本需要一个字节数组。

我该如何修改我的PHP函数来模仿C#函数?

c#的功能是第三方,我无法改变它;我需要用PHP编写相当于给定的字符串以相同的方式编码

+2

我不知道Rijndael的函数是如何工作的,但是在您的PHP版本中'1'的数量是11而不是.NET版本中'1'的数量? – mellamokb

+3

'try {...} catch {throw; }只是代码污染。 –

+1

[Rewrite Rijndael 256 C#Encryption Code in PHP]可能的重复(http://stackoverflow.com/questions/3505453/rewrite-rijndael-256-c-sharp-encryption-code-in-php) –

回答

-1

我会尝试的,而不是27 1的字符串使用,这一点:

$key128 = ''; 
for ($i = 0; $i < 27; ++$i) 
    $key128 .= chr(1); 
$iv = $key128; // copy 

我不完全知道是什么这些函数会这样做,但这会将您的字符串转换为重复1的字节数组。

1

看看在RijndaelManaged的文件并复制:

  • 加密模式(CBC)
  • 块大小
  • 填充模式(PKCS#7)

请注意,您可以从别处检索填充。

现在确保您对双方使用完全相同的输入。您可以通过以十六进制值输出密钥,IV和纯文本来完成此操作。密钥大小和IV大小应该是算法所需的确切位数。要获得相同的纯文本,您需要使用相同的 s。

最后你需要相同的密文编码,但看起来你已经覆盖了这个。