Любой способ расшифровать pkcs7 дополненный AES 256 CBC из рубина? - PullRequest
1 голос
/ 27 августа 2009

Я постоянно получаю "плохое дешифрование", пытаясь расшифровать строку из программы на c #, используя один и тот же iv с обеих сторон. Это становится немного раздражающим, и я не могу понять проблему.

Это код рубина

def unencrypt(message) 
 c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
 c.padding = 1
 c.decrypt
 c.key = key = Digest::SHA1.hexdigest("mytestiv1111111111111111111111111").unpack('a2'*32).map{|x| x.hex}.pack('c'*32)
 c.iv = iv = key
 e = c.update(Base64.decode64(message))
 e << c.final
 puts e
end

И это то, что делает шифрование на стороне c #

public string  encrypt(string text, //the text to be encrypt
                       string password,// the encryption key
                       int cipherindex//The strength of the encryption
                      )
{
    try
    {    
        //get the cipher strength--from cipherindex
        CipherKey Key=CipherKey.getCipherKey(cipherindex);
        //build and init the Encryptor
        RijndaelManaged rijndaelCipher = new RijndaelManaged();
        rijndaelCipher.Mode = sCipherMode;
        rijndaelCipher.Padding = sPaddingMode;
        rijndaelCipher.KeySize = Key.Size;
        rijndaelCipher.BlockSize =Key.Size;
        byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);
        byte[] keyBytes = new byte[Key.Len]; 
        int len= pwdBytes.Length;
        if (len > keyBytes.Length) len= keyBytes.Length;
        System.Array.Copy(pwdBytes,keyBytes,len);
        rijndaelCipher.Key = keyBytes;
        rijndaelCipher.IV = keyBytes;
        ICryptoTransform transform = rijndaelCipher.CreateEncryptor();

        byte [] plainText = System.Text.Encoding.UTF8.GetBytes(text);
        byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
        return Convert.ToBase64String(cipherBytes);
    }
    catch (Exception e)
    {
        throw;
    }

}

Есть идеи? Ура Давид

1 Ответ

1 голос
/ 29 августа 2009

Ваши ключи для меня выглядят совершенно иначе,

  1. В Ruby вы используете SHA1 для получения ключа.
  2. В C # пароль используется необработанным.

Дамп двоичных ключей буфера на обеих платформах, чтобы убедиться, что они идентичны. Затем вы просто убираете свое первое препятствие:)

...