rijndael 128 cfb C# and php



我有问题。我有一种在PHP和C#中加密密码的方法,但是两种算法都无法获得相同的结果。有人可以帮我吗?

php

<?php
$password = 'MySecretPass';
$secret = '65rgt85k89xrDAr3';
$iv = 'AAAAAAAAAAAAAAAA';

$td = mcrypt_module_open('rijndael-128', '', 'cfb','');
mcrypt_generic_init($td, $secret, $iv);
$password = mcrypt_generic($td, $password);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$password=base64_encode($password);
echo $password;
?>

c#

var password = padString("MySecretPass");
txtEncrypt.Text = Convert.ToBase64String(EncryptStringToBytes(password,
    Encoding.UTF8.GetBytes("65rgt85k89xrDAr3"), 
    Encoding.UTF8.GetBytes("AAAAAAAAAAAAAAAA"), PaddingMode.None));
txtEncrypt.Text = txtEncrypt.Text;

static byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv, PaddingMode mode)
{
    byte[] encrypted;
    using (var rijAlg = new RijndaelManaged { Mode = CipherMode.CFB, BlockSize = 128, Padding = mode })
    {
        rijAlg.Key = key;
                rijAlg.IV = iv;
                var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
                using (var msEncrypt = new MemoryStream())
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (var swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }
    return encrypted;
}
     private static String padString(String source)
     {
         char paddingChar = ' ';
        int size = 16;
         int x = source.Length % size;
         int padLength = size - x;
         for (int i = 0; i < padLength; i++)
         {
             source += paddingChar;
         }
         return source;
     }

PHP的结果为"/knlzi/fzoerwl79",但对于C#IS/j643dvar4/gh0ayhdshnw =====。我不知道为什么我的结果有所不同。此外,我在Java中编写了代码,并且得到了与C#。

中相同的结果。

预先感谢。

可能是Encoding.GetBytes(string)返回" Unicode编码"。这实际上不存在编码,但它返回UTF-16。另一方面,您将钥匙和IV视为ASCII字符。

因此,无论编码PHP使用哪种,都会存在不匹配。您应该明确定义在将文本字符串转换为字节时,应使用哪些编码,这既在php code中均以您的C#代码。

中的C#代码。

最新更新