crypt SHA-512算法(c#)的澄清

crypt SHA-512算法(c#)的澄清,c#,encryption,salt,crypt,sha512,C#,Encryption,Salt,Crypt,Sha512,编辑:很抱歉,我忘了提及,我没有使用实现的sha512加密,因为据我所知,它不涉及计算哈希的salt值或指定的轮数 好的,我正在用c#对sha-512密码进行编码,并遵循这里的步骤 这是我第一次做任何与加密相关的事情,所以我想确保我正确理解了这些步骤。。。我不太懂c代码,无法直接将c翻译成c:/ 我假设完成摘要与计算哈希相同。在本例中,我还假设当这些步骤引用一个完成的摘要时,它们引用的是计算的哈希,而不是哈希前的计算摘要字节。如果我错了,请纠正我 假设步骤1-8的所有工作都已正确完成,我的怀疑

编辑:很抱歉,我忘了提及,我没有使用实现的sha512加密,因为据我所知,它不涉及计算哈希的salt值或指定的轮数

好的,我正在用c#对sha-512密码进行编码,并遵循这里的步骤

这是我第一次做任何与加密相关的事情,所以我想确保我正确理解了这些步骤。。。我不太懂c代码,无法直接将c翻译成c:/

我假设完成摘要与计算哈希相同。在本例中,我还假设当这些步骤引用一个完成的摘要时,它们引用的是计算的哈希,而不是哈希前的计算摘要字节。如果我错了,请纠正我

假设步骤1-8的所有工作都已正确完成,我的怀疑从步骤9开始

9。对于密码字符串中每个32或64字节的块(不包括 C表示法中的终止NUL),将摘要B添加到摘要A中

因为我使用的是SHA-512,所以块大小为64字节

下面的代码会产生期望的结果吗

//FYI, temp = digestA from steps 1-3 (before expanding digestA for step 9)
//alt_result = computed digestB hash (64 byte hash)

for (cnt = key.Length; cnt > 64; cnt -= 64)                         //9
{
    int i = 0;
    ctx.TransformBlock(alt_result, 0, 64, digestA, temp.Length + 64 * i);
    i++;
}

如果有人能澄清我所说的是正确的,我将不胜感激。谢谢

salt就像在输入字符串的末尾附加一个固定字节字符串一样简单。本质上是为您的输入提供已知的“自主”转换


关于算法本身:您似乎一开始就处于劣势。作为新手,你对基本的加密术语做了很多“假设”,甚至需要澄清。如果CLR实现对您不起作用,我认为您最好花时间寻找一个好的C实现,并找出如何集成到该实现中。找出对它的互操作(extern)调用将比深入到加密的内部过程容易得多,结果将更有效,并且您获得的关于本机互操作的知识将更有用/可重用。

我将为以后可能遇到此问题的其他人补充一些重要的说明

第一: SHA512和SHA512Crypt是用于两种不同目的的两种不同算法。SHA512是一种通用哈希算法()。SHA512Crypt是一种密码存储或基于密码的密钥派生算法,在内部使用SHA512(哈希)。SHA512Crypt基于早期使用MD5而不是SHA512的Crypt函数

专门创建了密码存储/密钥生成算法,以使暴力的成本提高几个数量级。完成此操作的典型方法是以某种方式迭代底层哈希算法。然而,你不想自己去做这件事。。。这让我们想到

第二: 不要编写自己的加密方法。()有很多方法可以把事情搞砸,即使你很清楚自己在做什么


如果您不想使用内置的Rfc2898DerviceBytes,因为它基于SHA1,那么您可以查看一个已知加密算法的实现或其他一些公共的、经过审查的实现。

您不想使用内置的SHA-512实现的任何原因?.NET已经有一个SHA512类:好的,因此,如果我只是使用内置方法,我将如何实现它来处理salt和指定的轮数?salt只是在初始哈希函数的输入中添加一个固定的blob,而SHA-512的定义表示它在内部执行80轮,如果您更改轮数,则不使用SHA-512。作为一个需要编写自己的SHA函数的大局图,您想做什么?我想复制一个输入/输出文件,该文件是使用unix的sha512crypt的人提供给我的。unix实现声明如下。。。“两种算法的默认轮次数均为5000。另一方面,为了确保最小的安全性和稳定性,N的最小值和最大值被强制执行:N的最小值为1000,N的最大值为9999999”。内置的80发子弹比较起来怎么样?谢谢你的回复。我可能应该提到我发现了一个java文件,它似乎是从c到java的正确翻译。我正在遵循我发布的链接中的步骤,并将java翻译成c,这对我来说并不难。我花了一段时间才弄明白如何在c#中复制MessageDigest函数,但我觉得我现在已经弄明白了。不过,我会考虑你的建议。爪哇: