【发布时间】:2019-09-21 23:25:22
【问题描述】:
我正在尝试在 PHP 中使用 DES 算法加密明文。
我设法用 C# 编写了一个工作示例:
String plaintext = "1y7wpc4iddseyrwez1lor8ow3297t.pd0bfl";
String pass = "rpsxi.t.rjsmklexarygfqyrrkhwdjh";
byte[] bytesPlain = Encoding.UTF8.GetBytes(plaintext);
byte[] bytesPass = Encoding.UTF8.GetBytes(pass).Take(8).ToArray();
DESCryptoServiceProvider p = new DESCryptoServiceProvider();
p.Mode = CipherMode.ECB;
ICryptoTransform t = p.CreateEncryptor(bytesPass, bytesPass);
CryptoStreamMode m = CryptoStreamMode.Write;
MemoryStream stream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(stream, t, m);
cryptoStream.Write(bytesPlain, 0, bytesPlain.Length);
cryptoStream.FlushFinalBlock();
byte[] encBytesPlain = new byte[stream.Length];
stream.Position = 0;
stream.Read(encBytesPlain, 0, encBytesPlain.Length);
string encrypted = Convert.ToBase64String(encBytesPlain);
System.Diagnostics.Debug.WriteLine(encrypted);
明文 = 1y7wpc4iddseyrwez1lor8ow3297t.pd0bfl
密码 = rpsxi.t.rjsmklexarygfqyrrkhwdjh
(仅密码的前 8 个字节用于加密消息)。
无论如何,当我尝试使用 crypt 函数或我在 github https://github.com/phpseclib/phpseclib-php5/blob/master/phpseclib/Crypt/DES.php 上找到的这个类来编写 PHP 版本时,我得到的结果与 C# 不同。
我完全确定 C# 代码可以正常工作,但我真的不知道如何在 PHP 中制作工作版本以在 Base64 中获得相同的结果。
Edit1:我已经知道 DES 不再安全,但我需要在网页中使用它只是为了学习目的,而且 C# 代码的编写方式是完全正确的,因为我需要遵循一些说明并获取这正是结果。
【问题讨论】:
-
有什么理由使用 DES?
-
如果您将 DES 用于除学习之外的任何其他用途,我强烈建议您选择其他算法。
-
C# 代码绝对不正确。您正在使用 48 位密钥,但 DES 使用 56 位密钥。您决不能为同一个密钥重复使用 IV。考虑使用 3DES 而不是 DES。 56 位现在被认为是一个太小的密钥空间。它可以在数小时内被暴力破解。最后,ECB 是您可以选择的最差的区块模式。
-
顺便说一句,你为什么不使用openssl?它已经内置在 PHP 中,它支持 DES 没有任何问题,而且我觉得它很容易使用。
-
如果您想学习,请阅读 PKCS#5:基于密码的加密 (PBE) - 但请注意,即使该标准也在老化。
标签: c# php encryption des