Ruby和Dot net之间的加密解密

4

我需要以下代码的dot net等效版本。问题在于,我正在客户端使用Ruby进行加密,以下是代码。 编码后的字符串将传递给C# Web服务。必须解密该字符串。

如果有人能提供此代码的dot net等效版本,则会很有帮助。

require 'rubygems'
require 'ezcrypto'
require 'crypt/rijndael'

plaintext = '24.9195N 17.821E'


aes_key = Crypt::Rijndael.new('0123456789abcdef0123456789abcdef')
aes_cyphertext = aes_key.encrypt_string(plaintext)
print "\n"

print aes_cyphertext +"\n"

print Base64.encode64(aes_cyphertext)
print "\n"

print aes_key.decrypt_string(aes_cyphertext)
print "\n"

我是一名C#开发人员,正在学习Ruby,所以我觉得你的问题很有趣,并尝试运行你的代码。但是我总是遇到以下错误。这是怎么回事? irb(main):009:0> aes_cyphertext = aes_key.encrypt_string(plaintext) NoMethodError: undefined method `length' for 48:Fixnum - mono68
1个回答

1

这将是一个类似下面代码的单元测试。第一部分进行加密,第二部分进行解密。

将代码粘贴到新的MSTest单元测试中(创建新的测试项目或添加到现有项目中)。

您需要相应地设置密钥和iv。

//needed to convert from hex string
public static byte[] FromHexString(string hexString)
{
  int NumberChars = hexString.Length;
  byte[] bytes = new byte[NumberChars / 2];
  for (int i = 0; i < NumberChars; i += 2)
    bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
  return bytes;
}

[TestMethod]
public void Test()
{
  string toEncryptString = "24.9195N 17.821E";
  //initialise key and IV (note - all zero IV is not recommended!)
  byte[] key = FromHexString("0123456789abcdef0123456789abcdef");
  byte[] iv = FromHexString("00000000000000000000000000000000");
  byte[] toEncrypt = System.Text.Encoding.UTF8.GetBytes(toEncryptString);

  byte[] cipherBytes = null;
  string cipherText = null;

  //encrypt
  using (System.Security.Cryptography.Rijndael r = new RijndaelManaged())
  {
    r.Key = key;
    r.IV = iv;
    using(System.Security.Cryptography.ICryptoTransform transform 
      = r.CreateEncryptor())
    {
      using (var mStream = new System.IO.MemoryStream())
      {
        using (var cStream = 
          new CryptoStream(mStream, transform, CryptoStreamMode.Write))
        {
          cStream.Write(toEncrypt, 0, toEncrypt.Length);
          cStream.FlushFinalBlock();
          cipherBytes = mStream.ToArray();
          cipherText = Convert.ToBase64String(cipherBytes);
        }
      }
    }
  }

  //decrypt
  byte[] toDecrypt = Convert.FromBase64String(cipherText);
  string decryptedString = null;
  using (System.Security.Cryptography.Rijndael r = new RijndaelManaged())
  {
    r.Key = key;
    r.IV = iv;
    using(System.Security.Cryptography.ICryptoTransform transform2
      = r.CreateDecryptor()) // <-- difference here
    {
      using (var mStream2 = new System.IO.MemoryStream())
      {
        using (var cStream2 = 
          new CryptoStream(mStream2, transform2, CryptoStreamMode.Write))
        {
          cStream2.Write(toDecrypt, 0, toDecrypt.Length);
          cStream2.FlushFinalBlock();
          decryptedString = 
            System.Text.Encoding.UTF8.GetString(mStream2.ToArray());
        }
      }
    }
  }

  Assert.AreEqual(toEncryptString, decryptedString);
}

你好,但我的问题仍然存在。实际上,我并没有在dot net中尝试enc-decryption。加密是通过上面展示的ruby代码完成的,而解密必须在C#中完成。这就是问题所在。如果我将ruby加密字符串传递给此函数,则会出现异常。其次,rubyt加密字符串为I/KHlflomjFprrySknfNN1D9QGjSYLR724GDF1yPw0wi2fGlxoudTc/CvfaQwJPF,而dot net加密字符串为V0if2VhxaEbTj4w4SEDBYKSSl0DxmLH/1zgZxjrfonM=。 - santubangalore
Ruby代码可能正在使用随机IV - 如果是这样,您将无法解密它,因为您需要知道密钥和IV才能使其工作。您可以使用解密代码执行解密操作 - 我并不是说您必须在C#中同时执行两个操作 - 只是提供了一个如何同时执行两个操作的示例; 因为您要求等效于Ruby代码的C#代码 :) - Andras Zoltan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接