将c#Rijndael函数转换为php函数

时间:2012-06-25 18:56:33

标签: c# php encryption

我正在尝试将C#函数转换为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); 
    }
}

目前,当我使用这两个函数对测试短语“test”进行编码时,我会得到不同的值。看起来PHP版本为$key$iv值采用字符串,其中C#版本采用字节数组。

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

[编辑] c#功能是第三方,我无权更改它;我需要在PHP中编写等效的代码以相同的方式编码给定的字符串

2 个答案:

答案 0 :(得分:1)

查看RijndaelManaged文档并复制:

  • 加密模式(cbc)
  • 块大小
  • 填充模式(pkcs#7)

请注意,您可以从其他地方检索填充。

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

最后你需要相同的密文编码,但似乎你已经覆盖了它。

答案 1 :(得分:-1)

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

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

我不完全确定这些函数是做什么的,但这会把你的字符串变成重复1的字节数组。