首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rijndael算法(右侧8位填充问题)

Rijndael算法(右侧8位填充问题)
EN

Stack Overflow用户
提问于 2009-11-04 12:40:28
回答 2查看 1.3K关注 0票数 0

我们正在使用Rijndael算法为windows mobile创建示例应用程序。它工作得很好。但问题是,当我们解密数据时,在示例的值的右侧有一个8位填充,我们正在加密交易的唯一密钥,它看起来是这样的:

加密前: MI03112009044625000000000000008024754008

解密后:MI031120090446250000000000008024754008揞⑁㋬㓠⥳空⠜資

在原始值中发生的这种右填充,有人能帮上忙吗?

代码:加密:

代码语言:javascript
复制
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();

解密:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-04 12:54:13

我认为这是因为您加密的字节少于48字节。

您可以尝试通过对明文进行编码/解码,也就是42字节,您将减少2个填充字节。

此外,但这可能取决于您使用的特定块密码,解密的数据可能系统地是块的倍数(在AES中默认为16,在Rijndael中通常是16)。

编辑: "To allow or not to allow padding...这就是问题所在!“

许多密码允许防止在最后一个块中填充(在某些情况下,甚至最后一个块的长度也只有几个字节!)对于不知道消息长度的接收者,这解决了寻找消息的有效结尾的问题。

在短消息的上下文中,这可能降低加密的强度,并且以下两种方法可以减轻这一影响:

  • 在消息的开头或结尾(或两者都添加)添加"salt“
  • 添加终止符序列(并使用填充)
  • 添加长度信息(并使用填充)

注意:这些建议有点棘手,从某种意义上说,它们本身可能会通过引入攻击者可以使用的“婴儿床”来削弱加密。例如,如果该长度是在消息的前4个字节中系统发送的,则攻击者可以使用此信息在密文中查找相应的模式。但是,我们不要过于偏执,这些简短的提示很难利用,特别是在与"salt“结合使用时。

"SALT“只是一个或多或少的随机字节序列,这些字节被添加到明文中的某个地方(通常在它之前或之后),并且被编码,就好像它是消息的一部分一样。然后,接收方从解密产生的明文中丢弃该盐。简单的盐可以是固定长度的,使其更容易移除,它也可以是可变长度的,由此长度可以在盐内的某处明确地指示,或者以更微妙和可变的方式编码/隐藏。

票数 1
EN

Stack Overflow用户

发布于 2009-11-05 15:45:36

我找到了删除解密数据中额外填充的解决方案。

代码:

代码语言:javascript
复制
this.algorithm.Mode = CipherMode.CBC;
protected SymmetricAlgorithm algorithm;
ICryptoTransform cryptoTransform = this.algorithm.CreateDecryptor();
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1671694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档