将C#的Rijndael函数转换为PHP函数

4

我将尝试将一个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
我不知道Rijndael函数是如何工作的,但是你的PHP版本中数字1的数量比你的.NET版本多11个,这重要吗? - mellamokb
3
try { ... } catch { throw; } 只是代码污染。 - H H
还有另一堆 - H H
你可以看到在大多数这些问题中key/iv是如何设置的。即使对于DES和AES代码也是适用的。 - H H
显示剩余2条评论
2个回答

1

请查看RijndaelManaged文档并复制以下内容:

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

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

现在,请确保两侧使用完全相同的输入。您可以通过以十六进制值打印密钥、IV和纯文本来实现这一点。密钥大小和IV大小应该是算法所需的确切位数。为了得到相同的纯文本,您需要使用相同的

最后,您需要相同的密文编码,但似乎您已经掌握了这个技巧。


-1

我建议使用以下内容代替 27 个 1 组成的字符串:

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

我不完全确定那些函数的作用,但它们会将你的字符串转换为重复1的字节数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接