使用DES算法加密明文

时间:2019-05-03 12:00:02

标签: c# php encryption des

我正在尝试使用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#代码的方式是完全正确的,因为我需要遵循一些说明并获得正是结果。

2 个答案:

答案 0 :(得分:1)

DES是已弃用的加密标准,除学习目的外,请勿将其用于其他任何用途。如果您打算使用它来加密敏感数据,AES可能是更好的选择。

除此之外,由于我有一段时间没有编码PHP了,但仍然想贡献一点,所以我对您现有的C#代码做了一些修正:

var plainText = "1y7wpc4iddseyrwez1lor8ow3297t.pd0bfl";
var password = "rpsxi.t.rjsmklexarygfqyrrkhwdjh";
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
var passwordBytes = Encoding.UTF8.GetBytes(password).Take(8).ToArray();

var des = new DESCryptoServiceProvider
{
    Mode = CipherMode.CBC, // don't use ECB as your CipherMode
    Padding = PaddingMode.PKCS7,
    Key = passwordBytes
};

des.GenerateIV(); // work with a unique IV for each operation

string encrypted = null;
using (var desEncryptor = des.CreateEncryptor())
{
    var resultStream = new MemoryStream();
    using (var cryptoStream = new CryptoStream(resultStream, desEncryptor, CryptoStreamMode.Write))
    {
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
    }

    encrypted = Convert.ToBase64String(resultStream.ToArray());
}

这仍然是不安全的,正如我在开始时说的那样,如果安全性对于正在构建的应用程序至关重要,则不应使用此功能。 不是该答案应该确保您的代码安全,只是指出您在使用C#Streams和常规编码准则时存在一些缺陷。

对于PHP部分this,答案可以与我发布的更新代码一起使用。您只需通过desdes.IV对象中提取IV,并将其用于PHP脚本即可实现相同的功能。

还值得注意的是,较新版本的PHP不推荐使用使用的函数mcrypt_encrypt,这使我回到了答案的第一句话:您可能应该完全停止使用DES!

答案 1 :(得分:1)

请不要再使用DES,因为它不再被认为是安全的。而是尝试使用AES。

还请注意,默认情况下,php crypt函数不会加密,而仅使用DES创建哈希值,这与加密不同。

来源:https://www.w3schools.com/php/func_string_crypt.asp