我必须重新创建从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);
答案 0 :(得分:1)
'1'
是一个字符文字。可以在默认的ASCII假设下将字符直接转换为字节。所以'1'
实际上是一个0x31字节而不是像PHP中那样的0x01字节。
你想要&#34;:
$key = "12345678";
$buffer
的解码是否正确取决于其内容以及您如何阅读。
一些注意事项:
现在不要使用DES。它真的不安全。 AES是一种更好的选择。
绝不使用ECB mode 。它具有确定性,因此在语义上不安全。您应该至少使用CBC或CTR等随机模式。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以使用经过验证的模式(如GCM或EAX)或encrypt-then-MAC方案来完成。