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 版本需要一个字符串 for$key$ivvalues,而 C# 版本需要一个字节数组。

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

[编辑] c# 函数是第 3 方,我无权更改它;我需要在 PHP 中编写等效的代码来以相同的方式对给定的字符串进行编码

4

2 回答 2

1

查看 RijndaelManaged 文档并复制:

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

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

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

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

于 2012-10-08T07:36:49.850 回答
-1

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

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

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

于 2012-07-18T21:09:48.970 回答