AES和SHA-1从Perl来.NET [英] AES and SHA1 from perl to .net

查看:243
本文介绍了AES和SHA-1从Perl来.NET的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我敲我的头在墙上。

我有以下的Perl code,我试图做到这一点在.NET没有成功:

I have the following Perl code, and I am trying to do this in .NET without success:

    my $cipher = Crypt::CBC->new(
            -iv => $iv,
            -literal_key => 1,
            -key => $key,
            -cipher => "Crypt::OpenSSL::AES",
            -blocksize => length($iv),
            -keysize => length($key),
            -header => "none"
            );

我的.NET code是:

my .net code is:

byte[] iv = new byte[] { 0x01,..... };
byte[] key = new byte[] { 0x01..... };

            RijndaelManaged aes = new RijndaelManaged();
            aes.Key = key;
            aes.IV = iv;

encryptStringToBytes_AES("bla bla bla", aes.KEY, aes.IV)

...
static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");

            // Declare the stream used to encrypt to an in memory
            // array of bytes.
            MemoryStream msEncrypt = null;

            // Declare the RijndaelManaged object
            // used to encrypt the data.
            RijndaelManaged aesAlg = null;

            try
            {
                // Create a RijndaelManaged object
                // with the specified key and IV.
                aesAlg = new RijndaelManaged();
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                msEncrypt = new MemoryStream();
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {

                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                }

            }
            finally
            {
                // Clear the RijndaelManaged object.
                if (aesAlg != null)
                    aesAlg.Clear();
            }

            // Return the encrypted bytes from the memory stream.
            return msEncrypt.ToArray();

        }

我究竟做错了什么???

What am i doing wrong???

谢谢!

推荐答案

试试这个:

UnicodeEncoding UE = new UnicodeEncoding();
byte[] bfr;
byte[] pwdBits = UE.GetBytes(plainText);
byte[] result;

int extends = (1 + (pwdBits.Length / 16)) * 16;
bfr = new byte[extends];

pwdBits.CopyTo(bfr, 0);

using (MemoryStream msCrypt = new MemoryStream())
{
    RijndaelManaged RMCrypto = new RijndaelManaged();
    RMCrypto.Padding = PaddingMode.PKCS7;
    using (ICryptoTransform encriptor = RMCrypto.CreateEncryptor(Key, IV))
    {
         using (CryptoStream cs = new CryptoStream(msCrypt, encriptor, CryptoStreamMode.Write))
         {
              cs.Write(bfr, 0, bfr.Length);
              cs.FlushFinalBlock();
              result = msCrypt.ToArray();
              cs.Close();
         }
         msCrypt.Close();
    }
}
return result;

这篇关于AES和SHA-1从Perl来.NET的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆