2013-11-04 46 views
0

我已经在C#中建立了一个简单的对称AES-en /解密,但是我遇到了填充问题。根据MSDN,PKCS#7的填充字节应该是0x07,但在我的情况下它只是零字节(0x00)。C#AES PKCS#7错误的填充字节?

这怎么可能?它几乎仿佛这不是在.NET中正确实施...

这里是我的代码:

Aes aes = new AesManaged(); 
aes.Key = new byte[] { /* ... */ }; 
aes.IV = new byte[] { /* ... */ }; 
// Debugging shows: 
// aes.Padding = PaddingMode.PKCS7 

// the data to encrypt (1 byte only, to demonstrate padding) 
byte[] plainData = new byte[1] { 0xFF }; 
byte[] encData; 

// (encrypt) 
using (MemoryStream encStream = new MemoryStream()) 
{ 
    using (CryptoStream cryptoStream = new CryptoStream(encStream, aes.CreateEncryptor(), CryptoStreamMode.Write)) 
    { 
     cryptoStream.Write(plainData, 0, plainData.Length); 
    } 
    encData = encStream.ToArray(); 
} 

// (new length is 16 bytes (128 bits), incl. padding) 
plainData = new byte[16]; 

// (decrypt) 
using (MemoryStream decrStream = new MemoryStream(encData)) 
{ 
    using (CryptoStream cryptoStream = new CryptoStream(decrStream, aes.CreateDecryptor(), CryptoStreamMode.Read)) 
    { 
     cryptoStream.Read(plainData, 0, plainData.Length); 
    } 
} 

// output: 
// 16 bytes, 
// 1st byte = 0xFF, 
// other 15 bytes = 0x00 (instead of 0x07!) 
+0

你不能用关键字堆叠你的问题标题吗?这不是必须的 - 这就是标签部分的用途。你可以花一些时间,编辑一些可读的东西吗? – slugster

+0

提出建议,我不知道还有什么可以选择的。 – marsze

回答

6

解密处理是否正确去除被加密施加了填充,因此零输出中的字节仅仅是原始plainData阵列中未触及的字节。 cryptoStream.Read(...)调用返回一个整数,指示读取的字节数(在这种情况下为1),您应该使用该整数来确定输出数组中有多少个字节是有效数据。

如果因任何原因,你希望看到的填充字节,可以aes.Padding = PaddingMode.None;后设置进行加密,但之前创建的解密。然后你会发现cryptoStream.Read(...)返回16,plainData0xff作为其第一个字节,其次是15个字节的0x0f填充(不知道为什么你的问题表明你期待0x07虽然)。

+0

这绝对有道理!我一定是盲目的... Thx! – marsze

0

对于PKCS7模式,它应该是blocksize - contentsize,即16 - 1 = 15在你的情况。你的错误是你在解密后期望它,但是在加密之前填充内部发生。根据所选择的模式,不保证plainData将包含填充的字节。

相关问题