首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么rijndael.key值与rijndael.iv不同?

为什么rijndael.key值与rijndael.iv不同?
EN

Security用户
提问于 2019-09-26 06:19:51
回答 1查看 1.5K关注 0票数 0

有人能告诉我rijndael是怎么工作的吗?

现在,我需要处理从key (使用rijndael + rfc2898derivebytes)生成的C#iv,以便与CryptoJS匹配

C#的代码片段:

代码语言:javascript
复制
byte[] saltArray = Encoding.ASCII.GetBytes("20190925");
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("password", saltArray, 1000);
rijndael.Key = pdb.GetBytes(32);
//output c1b34ea814586db4a22dad37e11c7256322ab0eee3a14ed1898f93d7a264242f
rijndael.IV = pdb.GetBytes(16);
//output 063ead20a9d5f35ab83e1156ebe7c099

rijndael.Keyrijndael.IV的结果是不同的。我以为rijndael.IV会显示rijndael.Key值的一半,因为pdb.GetBytes(16)pdb.GetBytes(32)的一半

我可以使用下面的代码使用rijndael+rfc2898derivebytes来匹配CryptoJS的键:

代码语言:javascript
复制
let key = CryptoJS.PBKDF2('password', '20190925', {keySize:256/32, iterations:1000})
//output c1b34ea814586db4a22dad37e11c7256322ab0eee3a14ed1898f93d7a264242f

但我不知道如何用cryptoJS获得同样的IV。有人有主意吗?

EN

回答 1

Security用户

回答已采纳

发布于 2019-09-26 07:46:51

通过实现您自己的加密,您在这里做了很多错误的事情。我不知道这是不是一个玩具项目来学习加密(不错!)或者如果这个应该被任何人真正使用,甚至是你自己(不要那样做)。

IV和key有非常不同的函数,不应该有重叠的值( IV将是长度的一半,因为它实际上是16字节,键是32字节,但绝对不应该是相同的值)。从同一个Rfc2898DeriveBytes对象派生字节给出不同结果的原因,是因为它只是继续密钥流。如果要两次使用相同的值,则需要重新初始化对象,使其从一开始就重新启动。但这不是你想要的。

关键是,嗯,秘密钥匙。IV是一个非秘密的唯一值,它只是使加密惟一,并允许使用相同的密钥执行多个加密操作(最多可达某个数目)。(在没有IV参数的算法中,如RC4,两次使用相同的密钥会导致完全解密。这就是为什么静脉注射是有用和重要的。)

从一个秘密密钥(这就是Rfc2898DeriveBytes将要做的事情)派生IV是一个非常糟糕的想法。这意味着每次静脉注射都是一样的。相反,您应该从CSPRNG生成IV,例如JavaScript中的Crypto.getRandomValues()或C#中的RNGCryptoServiceProvider。您可以将IV值附加到加密的值上,通常在其前面,这样就不必读取整个消息才能配置算法。

所有这些都可以在其他问题中找到。请参见:

最后,您需要使用经过身份验证的加密。这个问题解释了加密身份验证代码的作用:MAC与加密

票数 2
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/218695

复制
相关文章

相似问题

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