2014-02-14 62 views
0

我正在使用c#实现Rijndael算法来加密/解密文件。下面是我的代码:在Rijndael加密算法中创建自定义长度密码

private void EncryptFile(string inputFile, string outputFile, string password) 
     { 

      try 
      { 

       UnicodeEncoding UE = new UnicodeEncoding(); 
       byte[] key = UE.GetBytes(password.ToString()); 

       string cryptFile = outputFile; 
       FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create); 

       RijndaelManaged RMCrypto = new RijndaelManaged(); 

       CryptoStream cs = new CryptoStream(fsCrypt, 
        RMCrypto.CreateEncryptor(key, key), 
        CryptoStreamMode.Write); 

       FileStream fsIn = new FileStream(inputFile, FileMode.Open); 

       int data; 
       while ((data = fsIn.ReadByte()) != -1) 
        cs.WriteByte((byte)data); 


       fsIn.Close(); 
       cs.Close(); 
       fsCrypt.Close(); 
      } 
      catch 
      { 

      } 
     } 

现在,事情是,该功能仅当密码长度为8的倍数。也就是说,如果密码的长度为8,16,32等,然后它不起作用。

+1

使用密钥为IV会失败CBC的目的并大幅降低安全性。 – SLaks

+0

安全性**很难**。在您可以安全使用加密基元之前,您需要了解更多关于加密技术的知识。 – SLaks

+1

你忘了问一个问题:) – tnw

回答

0

伪代码=>

string passwordFlagLength(string password) 
{ 
    int count = 1 
    for (int i = 0 to 31) 
    { 

     if (password.length == count) return password; 
     if (password.length < count) return password + new string("x", count - password.length); 
     count = count * 2 
    } 
} 

这需要一个口令,并使其长度为1,2,4,8,等...高达31位的值。(INT瓦特/输出负)

如果值已经是一个正确的标志大小号,它使用它,否则它在填充其余的用“X”

- >注:我就用大家好别人的意见同意了做安全/问题,我刚刚发布了这个,因为发布的直接问题是由于字符串大小不是基2位v ALUE。我也只是应用了我在原始代码中忘记的计数

2

只需获取密码并以字节为单位获取其Unicode代表性就非常可怕。请不要这样做!正确的做法是使用salted hash作为密钥 - 也就是说,取一个salt,一个密码,并用散列函数将它们混合在一起。

要从可变长度密码派生密钥,请使用PBKDF2。 PBKDF2旨在在攻击者快速访问数据时使暴力强度变得更慢。

string password = ...; 
byte[] salt = ...; 
int keyLength = 32; 

byte[] key; 

using(var pbkdf = new Rfc2898DeriveBytes(password, salt)) 
{ 
    key = pbkdf.GetBytes(keyLength); 
} 

如果你需要的东西,它使用较少的CPU,HMAC将工作,但也以更快的速度蛮力:

using(var hmac = new HMACSHA256()) 
{ 
    hmac.Key = salt; 
    key = hmac.ComputeHash(Encoding.UTF8.GetBytes(password)); 
} 

注意,存在硬件现在能非常有效地攻击PBKDF2所以这亿韩元”不要花大力气去帮助一个有决心的攻击者。如果这对你很重要,那么分支出.NET基类并使用更现代的算法,如scrypt可能是首选。

+2

你还需要一个独特的IV。 – SLaks

+0

确实。试图让答案更具体到他的调查。 –