从C#到PHP的DES加密无法按预期工作

时间:2016-06-08 13:51:38

标签: c# php encryption mcrypt des

我必须重新创建从c#到php的东西。 我真的不知道该怎么做因为我从来没有真正处理加密等事情。

在c#中我得到了这个:

pthread

并且我必须使用的密钥加密如下:

public static byte[] decrypt(byte[] data, byte[] key)
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();

        des.Key = key;
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.None;

        return des.CreateDecryptor().TransformFinalBlock(data, 0, data.Length);
    }

public static byte[] encrypt(byte[] data, byte[] key)
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();

        des.Key = key;
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.None;

        return des.CreateEncryptor().TransformFinalBlock(data, 0, data.Length);
    }

public static byte[] get8byte(string input)
    {
        byte[] ByteArray = new byte[8];
        string tmp = string.Empty;
        int j = 0;
        for (int i = 0; i < 16; i++)
        {
            tmp = "" + input[i];
            tmp = tmp + input[i + 1];
            ByteArray[j] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber);
            j++;
            i++;
        }
        return ByteArray;
    }

“缓冲区”来自USB驱动器,其上有一个文件,其中包含16个字符的主密钥。 我真的不知道如何在PHP中实现它。我尝试了很多东西,比如pack('C *',$ var)和类似的东西,但我没有得到相同的结果。 这里有谁知道如何处理它?我不知道我是否正确的方式,但我尝试过这样的事情:

var Buffer = new char[16];
var cMasterKey = new byte[8];
byte[] Key = {
       (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5',
       (byte) '6', (byte) '7', (byte) '8'
}; 
cMasterKey = DESUtils.get8byte(new string(Buffer));
MasterKey = DESUtils.decrypt(cMasterKey, Key);

1 个答案:

答案 0 :(得分:1)

C#中的

'1'是一个字符文字。可以在默认的ASCII假设下将字符直接转换为字节。所以'1'实际上是一个0x31字节而不是像PHP中那样的0x01字节。

你想要&#34;:

$key = "12345678";

$buffer的解码是否正确取决于其内容以及您如何阅读。

一些注意事项:

  • 现在不要使用DES。它真的不安全。 AES是一种更好的选择。

  • 绝不使用ECB mode 。它具有确定性,因此在语义上不安全。您应该至少使用CBCCTR等随机模式。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以使用经过验证的模式(如GCM或EAX)或encrypt-then-MAC方案来完成。