【问题标题】:DES Encryption from C# to PHP not working as expected从 C# 到 PHP 的 DES 加密未按预期工作
【发布时间】:2016-10-08 20:07:51
【问题描述】:

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

在 c# 中我得到了这个:

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;
    }

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

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);

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

$key = pack('C*', 1, 2, 3, 4, 5, 6, 7, 8);
$masterbyte = pack('C*', $buffer);
$decmasterkey = mcrypt_decrypt(MCRYPT_DES, $key, $masterbyte, MCRYPT_MODE_ECB);

【问题讨论】:

  • 考虑接受有帮助的答案。要接受答案,请单击最佳答案旁边的空心复选标记,这样做会提高您的声誉并提供更多功能,请参阅reputation faq 更多详细信息,请参阅this page

标签: c# php encryption mcrypt des


【解决方案1】:

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

你“想要”:

$key = "12345678";

$buffer的解码是否正确,取决于它的内容和你的阅读方式。


一些注意事项:

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

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

【讨论】:

  • 起初。感谢您的答复。我知道 DES 不安全,但我无法更改它,因为它在这样的生产系统中使用。欧洲央行也是如此。所以 $key = "12345678" 相当于我在问题中写的 c# 的 "bytething"?
  • @Goneja 所以安全不是优先事项,在这个时代很有趣。我希望您让您的用户知道安全性很差。
  • 老兄,它背后还有一点,然后只是在 1 个小 php 脚本中更改 1 个加密方法。
  • 这就是程序员的报酬。那么,你会接受银行的这个借口吗?
  • "所以 $key = "12345678" 相当于我在问题中写的 c# 的 "bytething"?" - 是的。是成功了还是有其他问题?
猜你喜欢
  • 2015-01-03
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2013-10-12
  • 2011-05-14
相关资源
最近更新 更多