php - .NET 和 PHP 加密之间的区别

标签 php .net encryption des

我有以下生成 key 的 c# 代码:

    public static byte[] Encrypt(byte[] plainData, string salt)
    {
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        DES.Key = ASCIIEncoding.ASCII.GetBytes(salt);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(salt);
        ICryptoTransform desencrypt = DES.CreateEncryptor();
        byte[] encryptedData = desencrypt.TransformFinalBlock(plainData, 0, plainData.Length);
        return encryptedData;
    }

    private string GetEncryptedKey(string key)
    {
        return BitConverter.ToString(KeyGeneratorForm.Encrypt(ASCIIEncoding.ASCII.GetBytes(key), "abcdefgh")).Replace("-", "");
    }

我正尝试在 PHP 中执行相同的操作:

function get_encrypted_key($key){
    $salt = "abcdefgh";
    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt));
}

但是,结果中存在一个小差异,因为最后 16 个字符总是不同的:

With key "Benjamin Franklin":
C# : 0B3C6E5DF5D747FB3C50DE952FECE3999768F35B890BC391
PHP: 0B3C6E5DF5D747FB3C50DE952FECE3993A881F9AF348C64D

With key "President Franklin D Roosevelt":
C# : C119B50A5A7F8C905A86A43F5694B4D7DD1E8D0577F1CEB32A86FABCEA5711E1
PHP: C119B50A5A7F8C905A86A43F5694B4D7DD1E8D0577F1CEB37ACBE60BB1D21F3F

我还尝试使用以下代码对我的 key 执行填充转换:

function get_encrypted_key($key){
    $salt = "abcdefgh";

    $extra = 8 - (strlen($key) % 8);
    if($extra > 0) {
        for($i = 0; $i < $extra; $i++) {
            $key.= "\0";
        }
    }

    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt));
}

但我最终得到的结果与没有填充的结果相同。

如果您对发生的事情有任何线索,我很乐意听到! :)

谢谢

最佳答案

您提到尝试使用“经典”填充片段。以下是对 mcrypt_encrypt documentation 上发布的片段的快速改编给出与从 C# 获得的结果相同的结果。

PKCS #7(C# 的 SymmetricAlgorithm 使用的默认填充方案)用字节填充,其中每个填充字节的值与填充的字节数相同,而不是零字节。

function get_encrypted_key($key)
{
    $salt = 'abcdefgh';
    $block = mcrypt_get_block_size('des', 'cbc');
    $pad = $block - (strlen($key) % $block);
    $key .= str_repeat(chr($pad), $pad);

    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt));
}

测试输出:

php > echo get_encrypted_key('Benjamin Franklin');
0b3c6e5df5d747fb3c50de952fece3999768f35b890bc391
php > echo get_encrypted_key('President Franklin D Roosevelt');
c119b50a5a7f8c905a86a43f5694b4d7dd1e8d0577f1ceb32a86fabcea5711e1

关于php - .NET 和 PHP 加密之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11004378/

相关文章:

php - 如何在查询中以天、小时、分钟、秒为单位拆分剩余时间

javascript - 从 JavaScript 异步运行 PHP

c# - 使用 .NET 4 和 C# 开发我需要什么版本的 Windows?

go - 如何使用明文密码加密AES256 CTR?

android - CipherOutputStream 损坏 Android 中的 header

javascript - 没有 Javascript 的动态网站内容?

php - 如何在 PHP 中暂停代码执行以及等待时会发生什么

.net - 如何对仅包含工具的包使用包还原?

mysql - .net 异常 已经有一个与此连接关联的打开的 DataReader,必须先将其关闭

networking - 使用 bufio.NewReader(conn) 阅读整条消息