【问题标题】:Convert this PHP code to C# Rijndael Algorithm将此 PHP 代码转换为 C# Rijndael 算法
【发布时间】:2011-02-09 18:29:25
【问题描述】:

我有这个 php 代码,我想获得完全等效的 C#

$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_192, $key, $salt . $message . $nonce, MCRYPT_MODE_CBC, $iv);
$base64Data = base64_encode($salt . $iv . $encryptedData);
$urlEncodedData = rawurlencode($base64Data);

感谢所有贡献!

【问题讨论】:

  • 我看到其他同类型的问题寻求相同的帮助,并以友好和幽默的方式回答,这个问题有什么问题?
  • @Vecdid 尝试先阅读问题,然后您就会明白为什么没有回答。
  • @Rob 我做了,很多赞成的答案。只是给你建议,接受或放弃,祝你好运解决你的问题,度过美好的一天!

标签: c# php


【解决方案1】:

变量太多,无法直接转换;我建议您检查它的作用并用 C# 重写它以符合原始代码的意图。

【讨论】:

    【解决方案2】:

    抱歉,但说实话 - 这个问题相当愚蠢。

    这些代码所做的只是一些讨厌的加密和编码。 PHP 充满了来自执行此操作的模块的全局函数。 对于 C#,您需要找到具有加密等方法的适当库/类。它可能会有不同的逻辑和参数。 我敢打赌,由于实现的不同,您甚至会得到一些输出差异。

    我想 this 是您能找到的最接近您的问题的答案

    【讨论】:

      【解决方案3】:

      反对者和末日贩子,看!

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Security.Cryptography;
      using System.IO;
      using System.Web;
      
      namespace EncryptData
      {
          class EncryptData
          {
          private static readonly Encoding ASCII_ENCODING = new System.Text.ASCIIEncoding();
      
          private static string md5(string text)
          {
              return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCII_ENCODING.GetBytes(text))).Replace("-", "").ToLower();
          }
      
          public abstract string nonce();
      
          public abstract string salt();
      
          public readonly string EncryptedData;
      
          public EncryptData(string message)
          {
      
              // set up encrytion object
              RijndaelManaged aes192 = new RijndaelManaged();
              aes192.KeySize = 192;
              aes192.BlockSize = 192;
              aes192.Padding = PaddingMode.None;
              aes192.Mode = CipherMode.CBC;
              aes192.Key = ASCII_ENCODING.GetBytes(md5(SECRET_KEY));
              aes192.GenerateIV();
      
              string localSalt = salt();
              string localNonce = nonce();
      
              // form the string for encrypting
              // and put into byte array
              string textToEncrypt = localSalt + message+ localNonce;
              byte[] plainTextBytes = ASCII_ENCODING.GetBytes(textToEncrypt);
      
              // encrypt the data            
              ICryptoTransform encryptor = aes192.CreateEncryptor();
              MemoryStream ms = new MemoryStream();
      
              CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
              cs.Write(plainTextBytes, 0, plainTextBytes.Length);
      
              // convert our encrypted data from a memory stream into a byte array.
              byte[] cypherTextBytes = ms.ToArray();
      
              // close memory stream
              ms.Close();
      
              byte[] combined = null;
              // combine data and convert to byte array
              combined = CombinedData(localSalt, aes192.IV, cypherTextBytes);
              // url encode data once converted to base64 string
              EncryptedData = HttpUtility.UrlEncode(base64CombinedData(combined), ASCII_ENCODING);
      
      
          }
      
          public byte[] CombinedData(string salt, byte[] IV, byte[] cypherTextBytes)
          {
              // convert salt string into byte array
              byte[] saltBytes = ASCII_ENCODING.GetBytes(salt);
      
              // catenate all the byte arrays into one
              // set up dest byte array with required size
              byte[] rv = new byte[saltBytes.Length + IV.Length + cypherTextBytes.Length];
      
              // copy in each byte array
              Buffer.BlockCopy(saltBytes, 0, rv, 0, saltBytes.Length);
              Buffer.BlockCopy(IV, 0, rv, saltBytes.Length, IV.Length);
              Buffer.BlockCopy(cypherTextBytes, 0, rv, saltBytes.Length + IV.Length, cypherTextBytes.Length);
      
              return rv;
          }
      
          public string base64CombinedData(byte[] rv)
          {
              return Convert.ToBase64String(rv);
          }
      
      }
      }
      

      【讨论】:

        【解决方案4】:

        在 Rob 提供的示例中,我认为他应该使用 PaddingMode.Zero 而不是 PaddingMode.None,因为这是 mcrypt_encrypt() 添加填充的方式。

        【讨论】:

          猜你喜欢
          • 2012-02-19
          • 2014-12-04
          • 1970-01-01
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-26
          相关资源
          最近更新 更多