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
Похоже, что модуль OpenSSL для Ruby по умолчанию использует заполнение типа PKCS5 (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/Cipher.html). Но Microsoft Rj-Managed использует PKCS7 по умолчанию. PKCS7 поддерживается в модуле Ruby, поэтому вы можете просто хотеть придерживаться этого (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/PKCS7.html). Лично, поскольку шифрование настолько лаконично, мне нравится вручную устанавливать каждый параметр, а не идти по умолчанию, даже если я использую настройку по умолчанию, чтобы убедиться, что они одинаковы на обоих концах. Я уже делал это с помощью С#/PHP, проверяю мой пост, чтобы узнать, помогает ли это вообще (С# Encryption to PHP Decryption) мое завершенное решение опубликовано как второй ответ.