2011-05-19 164 views
1

我有以下用于加密和解密的代码。问题是,除了解密的文本解密,我在文本后面有一些“aaaaa”。为什么?需要一些帮助。谢谢!Rijndael加密/解密

public static byte[] Encrypt(byte[] PlainTextBytes, string key , string InitialVector) 
     { 
      try 
      { 
       System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
       Byte[] KeyBytes = encoding.GetBytes(key); 
       byte[] InitialVectorBytes = encoding.GetBytes(InitialVector); 
       RijndaelManaged SymmetricKey = new RijndaelManaged(); 
       ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes); 
       MemoryStream MemStream = new MemoryStream(); 
       CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write); 

       CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length); 
       CryptoStream.FlushFinalBlock(); 
       byte[] CipherTextBytes = MemStream.ToArray(); 

       return CipherTextBytes; 

// decrytion

public static string Decrypt(byte[] PlainTextBytes1, string key, string InitialVector) 
    { 
     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
     Byte[] KeyBytes = encoding.GetBytes(key); 
     RijndaelManaged SymmetricKey = new RijndaelManaged(); 
     byte[] InitialVectorBytes = Encoding.UTF8.GetBytes(InitialVector); 

     ICryptoTransform Decryptor = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes); 
     MemoryStream MemStream1 = new MemoryStream(PlainTextBytes1); 
     CryptoStream CryptoStream = new CryptoStream(MemStream1, Decryptor, CryptoStreamMode.Read); 
     Byte[] pltxt = new byte[PlainTextBytes1.Length]; 
     CryptoStream.Read(pltxt, 0, pltxt.Length); 

     ASCIIEncoding textConverter = new ASCIIEncoding(); 

     round = textConverter.GetString(pltxt); 
      return round; 

    } 

我在哪里错了?

+0

字节[]的大小是否相同? – 2011-05-19 07:31:02

+0

你是什么意思? – ely 2011-05-19 08:05:14

+0

需要一些帮助..请给解决方案! – ely 2011-05-19 08:05:31

回答

5

在你解密功能,您有:

Byte[] pltxt = new byte[PlainTextBytes1.Length]; 

这是错的,因为暗号文本比纯文本的时间越长,因为它填补获得块大小的倍数。

CryptoStream.Read(pltxt, 0, pltxt.Length); 

Read返回实际返回的字节数。它不能保证它会返回您请求的字节数量。


然后还有其他多种缺陷/不良作风的事情:

  1. 传入Decrypt的参数称为PlainTextBytes1它应该被称为密文。
  2. 您从字符串中创建密钥/初始字节的方式。 ASCII编码在这里是一个不错的选择。 ASCII不能表示任何字节字符串。也许你想要十六进制/解码一个字符串的两倍大小的字符?
  3. ASCII编码/解码纯文本只能用于ASCII字符,并会默默破坏所有其他字符。为什么不使用UTF-8呢?
  4. .net命名约定说您应该使用小写字母名称作为参数
+0

thx为答案!你能告诉我如何更正pltxt以获得正确的结果吗? PLZ :)。谢谢。我知道要求你重写代码太多了! – ely 2011-05-19 07:42:03

+0

加'MemoryStream'和'CryptoStream'都实现了'IDisposable',因此应该用'using'语句包装 – ChrisWue 2011-05-19 07:45:46

+0

什么是填充长度的解决方案? – ely 2011-05-19 08:04:57