如何解决C#和PHP加密的字符串结果不同,字节相同
我必须实现一个系统,在该系统中我们将加密消息发送到我们无法控制的另一个应用程序。 我们使用 C#,而其他应用程序使用 PHP。
我想确保的第一件事是,对于相同的输入,我会在 C# 和 PHP 中获得相同的加密输出。
我使用了一个使用 openssl_encrypt (CBC) 的 PHP 示例和一个使用 system.security.cryptography.RijndaelManaged 的 C# 示例。
$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 完全相同的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。