2013-10-27 192 views
3

這裏的加密方法:AES加密錯誤:輸入數據不是一個完整的塊?

public static byte[] Encrypt(byte[] plaintext, byte[] key) 
{ 
    using (var aes = Aes.Create()) 
    { 
     aes.BlockSize = 128; 
     aes.Mode = CipherMode.ECB; 
     aes.Padding = PaddingMode.None; 

     var iv = new byte[16]; 
     for (int i = 0; i < iv.Length; i++) 
      iv[i] = 0; 
     aes.IV = iv; 

     var encryptor = aes.CreateEncryptor(key, aes.IV); 
     using(var target = new MemoryStream()) 
     using (var cs = new CryptoStream(target, encryptor, CryptoStreamMode.Write)) 
     { 
      using (var source = new StreamWriter(cs)) 
       source.Write(plaintext); 
      return target.ToArray(); 
     } 
    } 
} 

怎麼我稱之爲:

var key = new byte[16] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
var plaintext = new byte[16] { 128, 0, 112, 0, 96, 0, 80, 0, 64, 0, 48, 0, 32, 0, 16, 0 }; 

但它保持在source.Write(明文),說這不是一個完整的塊拋出異常?我使用的是一個16字節/ 128位的數組,塊大小設置爲128.我不明白有什麼問題?另外,只是爲了避免任何建議,歐洲央行是壞等,這不是生產,我只是在玩。

+1

順便說一句,'新的字節[16]'已初始化到'0'。 – SLaks

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

6

StreamWriter將UTF8文本字符寫入流中。
你在寫作plaintext.ToString()作爲密文的文本。

這將返回"System.Byte[]",它不會轉換爲16字節的UTF8。

+0

好的。什麼是加密字節數組的正確方法? – ConditionRacer

+1

@ Justin984他說如果你已經有了一個字節數組,你不需要使用'StreamWriter',因爲這是爲了將字符串轉換爲具有特定編碼的字節數組(默認情況下是UTF-8)。只需使用['Stream.Write()'](http://msdn.microsoft.com/en-us/library/system.io.memorystream.write(v = vs.110)]將您的字節寫入流中即可。 ASPX)。 –

0

我改變了功能,以這樣的:

public static byte[] Encrypt(byte[] plaintext, byte[] key) 
{ 
    using (var aes = Aes.Create()) 
    { 
     aes.BlockSize = 128; 
     aes.Mode = CipherMode.ECB; 
     aes.Padding = PaddingMode.None; 

     var encryptor = aes.CreateEncryptor(key, new byte[16]); 
     using(var target = new MemoryStream()) 
     using (var cs = new CryptoStream(target, encryptor, CryptoStreamMode.Write)) 
     { 
      cs.Write(plaintext, 0, plaintext.Length); 
      return target.ToArray(); 
     } 
    } 
} 
2

我相信問題是填充模式。除非要加密的文本可以被BlockSize整除(位數或BlockSize/8以字節計),否則應該指定除None以外的PaddingMode。

看到post here例如代碼

相關問題