有人能告诉我rijndael是怎么工作的吗?
现在,我需要处理从key (使用rijndael + rfc2898derivebytes)生成的C#和iv,以便与CryptoJS匹配
C#的代码片段:
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 063ead20a9d5f35ab83e1156ebe7c099rijndael.Key和rijndael.IV的结果是不同的。我以为rijndael.IV会显示rijndael.Key值的一半,因为pdb.GetBytes(16)是pdb.GetBytes(32)的一半
我可以使用下面的代码使用rijndael+rfc2898derivebytes来匹配CryptoJS的键:
let key = CryptoJS.PBKDF2('password', '20190925', {keySize:256/32, iterations:1000})
//output c1b34ea814586db4a22dad37e11c7256322ab0eee3a14ed1898f93d7a264242f但我不知道如何用cryptoJS获得同样的IV。有人有主意吗?
发布于 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与加密
https://security.stackexchange.com/questions/218695
复制相似问题