微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#和PHP加密的字符串结果不同,字节相同

如何解决C#和PHP加密的字符串结果不同,字节相同

我必须实现一个系统,在该系统中我们将加密消息发送到我们无法控制的另一个应用程序。 我们使用 C#,而其他应用程序使用 PHP

我想确保的第一件事是,对于相同的输入,我会在 C# 和 PHP 中获得相同的加密输出

需要明确的是,我无法更改接收应用程序使用的 PHP 代码

我使用了一个使用 openssl_encrypt (CBC) 的 PHP 示例和一个使用 system.security.cryptography.RijndaelManaged 的​​ C# 示例。

PHP 测试代码

$opts=OPENSSL_RAW_DATA;
$plain_text = "wetestendit";
$key = "12345678911234567892123456789312";
$iv = "1234567890123456";
$opts=OPENSSL_RAW_DATA;
$plaintext = "wetestendit";
$key = "12345678911234567892123456789312";
$iv = "1234567890123456";

$saltDing = "Salted__12345678";

$encrypt = openssl_encrypt($plain_text,"AES-256-CBC",$key,$opts,$iv);
$encrypt2 = openssl_encrypt($plain_text,$iv);

echo $encrypt . "\n";
echo $encrypt2 . "\n";

当使用 RAW_Data 输出格式时,我的测试给出:?Y09?¬???}?)?v?作为输出。 使用 0 时,输出采用 base64 编码:x1kwoeUf3fmUfdQpknbjkw==

如果我使用下面的 C# 函数和同一个键,iv 和 input

private string EncryptString(string message,string KeyString,string IVString)
{
    byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
    byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);

    string encrypted = null;
    RijndaelManaged rj = new RijndaelManaged();
    rj.Key = Key;
    rj.IV = IV;
    rj.Mode = CipherMode.CBC;

    MemoryStream ms = new MemoryStream();

    using (CryptoStream cs = new CryptoStream(ms,rj.CreateEncryptor(Key,IV),CryptoStreamMode.Write))
    {
        using (StreamWriter sw = new StreamWriter(cs))
        {
            sw.Write(message);
            sw.Close();
        }
        cs.Close();
    }
    byte[] encoded = ms.ToArray();
    
    ms.Close();

    return Encoding.ASCII.GetString(encoded);
}

我得到 ?Y09?\u001f???}?)?v??作为结果。如果我先base64字节数组,输出是x1kwoeUf3fmUfdQpknbjkw==,和PHP一样。不幸的是,PHP 代码使用原始输出,所以我需要确保它们是相同的。

有趣的是,使用 PHP ord 和检查 c# 字节数组的单个字节是相同的。然而,输出虽然看起来相似,但并非如此。

我已经尝试了 C# 中的所有填充模式,但没有一个给出与 PHP 完全相同的结果。

有没有办法确保 C# 和 PHP 给出相同的输出

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。