2
 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はすべて「1」に変更されています。

ここで他の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
4

1 に答える 1

2

Ruby用のOpenSSLモジュールはデフォルトでPKCS5タイプのパディングを使用しているようです(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/Cipher.html)。ただし、MicrosoftRj-ManagedはデフォルトでPKCS7を使用します。PKCS7はRubyモジュールでサポートされているので、それを使い続けることをお勧めします(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/PKCS7.html)。個人的には、暗号化は非常に厄介なので、デフォルト設定を使用している場合でも、両端が同じであることを確認するために、デフォルト設定ではなく、すべてのオプションを手動で設定するのが好きです。私は以前にC#/ PHPでこれを行ったことがあります。私の投稿をチェックして、それがまったく役立つかどうかを確認してください(C#暗号化からPHP復号化)。完成したソリューションが2番目の回答として投稿されます。

于 2012-09-26T22:16:28.317 に答える