【问题标题】:Encrypting in .Net decrypting in php在 .Net 中加密 在 php 中解密
【发布时间】:2011-01-22 23:29:04
【问题描述】:

我正在编写一些由 php 解密的 C# 加密。他们合作得不是很好。 php 客户端已通知我他们的配置(RSSL_KEYGEN_PKCS5_V20,CBC 模式下的 256 位 AES,RSSL_PAD_ANSIX923)。这是我整理的:

public static byte[] Encrypt(byte[] plainText, string password,
         CipherMode cipherMode, int keySize, PaddingMode paddingMode)
    {
        byte[] salt = new byte[8];
        new RNGCryptoServiceProvider().GetBytes(salt);

        // PKCS#5 V2.0 PBKDF2 keyGenerator (uses default iteration count of 1000) 
        Rfc2898DeriveBytes keyGenerator = new Rfc2898DeriveBytes(password, salt);

        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.Mode = cipherMode;
        aes.KeySize = keySize;
        aes.Padding = paddingMode;
        aes.Key = keyGenerator.GetBytes(aes.KeySize / 8);

        // aes.Padding is left default PaddingMode.PKCS7 
        // aes.IV should be automatically set to some random value by .NET 
        // (as described in http://msdn.microsoft.com/en-us/library/5e9ft273(VS.71).aspx) 

        // Overestimate encrypted size requirements 
        byte[] encryptedDataBuffer = new byte[plainText.Length + 32 + 32 + 8];
        MemoryStream encryptedOutput = new MemoryStream(encryptedDataBuffer, true);
        CryptoStream encStream = new CryptoStream(encryptedOutput, aes.CreateEncryptor(),
                                                  CryptoStreamMode.Write);

        encryptedOutput.Write(salt, 0, salt.Length);
        encryptedOutput.Write(aes.IV, 0, aes.IV.Length);
        encStream.Write(plainText, 0, plainText.Length);

        encStream.FlushFinalBlock();
        byte[] encryptedData = new byte[encryptedOutput.Position];
        Array.Copy(encryptedDataBuffer, encryptedData, encryptedData.Length);
        encStream.Close();

        return encryptedData;
    }

我可以加密和解密它,但他们不能解密它。我在这里做错了什么吗?我传递了这样的内容:

Encrypt(mytext, myPassword, CipherMode.CBC, 256, PaddingMode.ANSIX923);

谢谢。

【问题讨论】:

  • 您确定他们在密钥生成中使用相同的轮数(1000)吗?
  • 应该是。这是默认设置。
  • c# 和 PHP 标记在同一个问题中?这不可能是真的……
  • 也许应该有一个“油和水”的徽章。

标签: c# php aes


【解决方案1】:

这对我自己来说是一个挑战,因为 .NET 和 mcrypt 处理“默认”AES256 实施的方式不同。在某些 PHP 版本中,m_crypt 使用零填充,因此您必须设置 .NET 端来执行相同的操作:

symmetricKey.Padding = PaddingMode.Zeros;

我在 github 上发布了一个示例 PHP 和 C# 解决方案,以帮助遇到相同问题的其他人: https://github.com/dchymko/.NET--PHP-encryption

【讨论】:

    【解决方案2】:

    首先缩小范围: 您是否生成相同的密钥?

    一旦你确定了这一点,你就可以考虑加密了。

    【讨论】:

      【解决方案3】:

      使用 CryptoServiceProvider 成功了。

       Encoding stringEncoding = new System.Text.UTF8Encoding();
      
              byte[] salt = new byte[8];
      
              new RNGCryptoServiceProvider().GetBytes(salt);
      
              AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
              aes.Mode = cipherMode;
              aes.KeySize = keySize;
      
              aes.Key = stringEncoding.GetBytes(password);
              aes.IV = new byte[aes.IV.Length];
      
              // Overestimate encrypted size requirements 
              byte[] encryptedDataBuffer = new byte[plainText.Length + 32 + 32 + 8];
              MemoryStream encryptedOutput = new MemoryStream(encryptedDataBuffer, true);
      
              CryptoStream encStream = new CryptoStream(encryptedOutput, aes.CreateEncryptor(),
                                                        CryptoStreamMode.Write);
      
              encStream.Write(plainText, 0, plainText.Length);
      
              encStream.FlushFinalBlock();
              byte[] encryptedData = new byte[encryptedOutput.Position];
              Array.Copy(encryptedDataBuffer, encryptedData, encryptedData.Length);
              encStream.Close();
      
              return encryptedData;
      

      【讨论】:

        猜你喜欢
        • 2011-02-06
        • 2011-04-29
        • 2012-05-23
        • 2019-10-02
        • 2012-05-19
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 2013-06-22
        相关资源
        最近更新 更多