我们正在使用Rijndael算法为windows mobile创建示例应用程序。它工作得很好。但问题是,当我们解密数据时,在示例的值的右侧有一个8位填充,我们正在加密交易的唯一密钥,它看起来是这样的:
加密前: MI03112009044625000000000000008024754008
解密后:MI031120090446250000000000008024754008揞⑁㋬㓠⥳空⠜資
在原始值中发生的这种右填充,有人能帮上忙吗?
代码:加密:
byte[] inputData = System.Text.Encoding.Unicode.GetBytes(inputDataString);
MemoryStream stream = new MemoryStream();
CryptoStream cStream = new CryptoStream(stream, RijndaelAlg.CreateEncryptor(key, value), CryptoStreamMode.Write);
cStream.Write(inputData, 0, inputData.Length);
cStream.Close();解密:
MemoryStream stream = new MemoryStream(outputData);
CryptoStream cStream = new CryptoStream(stream, RijndaelAlg.CreateDecryptor(key, value), CryptoStreamMode.Read);
cStream.Read(outputData, 0, outputData.Length);
cStream.Close();
byte[] decryptedData = stream.ToArray();
return System.Text.Encoding.Unicode.GetString(decryptedData, 0, decryptedData.Length);有没有其他的解决方案?因为我们不能得到原始数据长度。
Geetha
发布于 2009-11-04 12:54:13
我认为这是因为您加密的字节少于48字节。
您可以尝试通过对明文进行编码/解码,也就是42字节,您将减少2个填充字节。
此外,但这可能取决于您使用的特定块密码,解密的数据可能系统地是块的倍数(在AES中默认为16,在Rijndael中通常是16)。
编辑: "To allow or not to allow padding...这就是问题所在!“
许多密码允许防止在最后一个块中填充(在某些情况下,甚至最后一个块的长度也只有几个字节!)对于不知道消息长度的接收者,这解决了寻找消息的有效结尾的问题。
在短消息的上下文中,这可能降低加密的强度,并且以下两种方法可以减轻这一影响:
注意:这些建议有点棘手,从某种意义上说,它们本身可能会通过引入攻击者可以使用的“婴儿床”来削弱加密。例如,如果该长度是在消息的前4个字节中系统发送的,则攻击者可以使用此信息在密文中查找相应的模式。但是,我们不要过于偏执,这些简短的提示很难利用,特别是在与"salt“结合使用时。
"SALT“只是一个或多或少的随机字节序列,这些字节被添加到明文中的某个地方(通常在它之前或之后),并且被编码,就好像它是消息的一部分一样。然后,接收方从解密产生的明文中丢弃该盐。简单的盐可以是固定长度的,使其更容易移除,它也可以是可变长度的,由此长度可以在盐内的某处明确地指示,或者以更微妙和可变的方式编码/隐藏。
发布于 2009-11-05 15:45:36
我找到了删除解密数据中额外填充的解决方案。
代码:
this.algorithm.Mode = CipherMode.CBC;
protected SymmetricAlgorithm algorithm;
ICryptoTransform cryptoTransform = this.algorithm.CreateDecryptor();
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)https://stackoverflow.com/questions/1671694
复制相似问题