如何从C#中解密这个RijandelManaged in ruby​​?

static byte[] keyBytes = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static byte[] iv = new byte[] { 1, 1, 1, 1 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static SymmetricAlgorithm getKey() { RijndaelManaged key = new RijndaelManaged(); key.Key = keyBytes; key.IV = iv; return key; } static string Encrypt(string PlainText) { SymmetricAlgorithm key = getKey(); MemoryStream ms = new MemoryStream(); CryptoStream encStream = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(encStream); sw.WriteLine(PlainText); sw.Close(); encStream.Close(); byte[] buffer = ms.ToArray(); ms.Close(); return Convert.ToBase64String(buffer); } static string Decrypt(string encrypted) { SymmetricAlgorithm key = getKey(); byte[] CypherText = Convert.FromBase64String(encrypted); MemoryStream ms = new MemoryStream(CypherText); CryptoStream encStream = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read); StreamReader sr = new StreamReader(encStream); string val = sr.ReadLine(); sr.Close(); encStream.Close(); ms.Close(); return val; } 

显然,关键和iv已被改为所有“一个”以保护有罪。

我在这里尝试过其他几篇SO文章,但无济于事。

我以为我会继续并显示我正在尝试使用的ruby openssl代码:

 def Crypt.decrypt(encrypted_data, key, iv, cipher_type) aes = OpenSSL::Cipher::Cipher.new(cipher_type) aes.decrypt #aes.padding = 1 aes.key = key aes.iv = iv if iv != nil aes.update(encrypted_data) + aes.final end 

看来Ruby的OpenSSL模块默认使用PKCS5类型填充( http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/Cipher.html )。 但Microsoft Rj-Managed使用PKCS7作为默认值。 Ruby模块支持PKCS7,因此您可能只想坚持使用它( http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/PKCS7.html )。 就个人而言,由于加密是如此挑剔,我喜欢手动设置每个选项而不是默认设置,即使我使用默认设置只是为了确保两端都相同。 我之前使用C#/ PHP完成了这项工作,查看我的post以查看是否有帮助( C#Encryption to PHP Decryption )我的完成解决方案是第二个答案。