Как мне расшифровать этот RijandelManaged на Ruby с C #?

 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, но безрезультатно.

Я подумал, что пойду вперед и покажу рубиновый код 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

person fregas    schedule 26.09.2012    source источник
comment
какую библиотеку вы используете на стороне Ruby?   -  person solidau    schedule 27.09.2012
comment
openssl, но я буду использовать что угодно. Мне просто нужно вернуть данные в незашифрованном виде.   -  person fregas    schedule 27.09.2012


Ответы (1)


Похоже, что модуль 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). Лично, поскольку шифрование настолько привередливо, мне нравится вручную устанавливать каждую опцию, а не использовать значение по умолчанию, даже если я использую настройку по умолчанию, чтобы убедиться, что они одинаковы на обоих концах. Я делал это раньше с C # / PHP, посмотрите мой пост, чтобы узнать, помогает ли это вообще (C # Encryption to PHP Decryption) мое готовое решение опубликовано как второй ответ.

person solidau    schedule 26.09.2012
comment
Итак, вы говорите, что я должен использовать класс OpenSSL :: PKCS7 напрямую для дешифрования? Я никогда не делал этого раньше, но я попробую и вернусь к вам. - person fregas; 27.09.2012
comment
Ха, ладно, я полностью потерялся. Я вообще не знаю, как использовать эту штуку. Не могли бы вы придумать пример кода? - person fregas; 27.09.2012
comment
извините, я на самом деле не кодирую Ruby ... но я поискал пример и думаю, что это может быть близко: stackoverflow.com/questions/9062830/ соответствующий строка для вас, вероятно, будет encrypted_data = OpenSSL :: PKCS7 :: encrypt ([@ paypal_cert], signed_data.to_der, cypher, OpenSSL :: PKCS7 :: BINARY) - person solidau; 27.09.2012