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

时间:2011-10-21 14:16:29

标签: c# encryption salt crypt sha512

编辑:抱歉,我忘了提及,我没有使用已实现的sha512地穴,因为据我所知,它不涉及盐值或指定数量的轮数来计算哈希与。

好的,所以我在c#编码sha-512 crypt,我按照这里的步骤进行编码......

http://people.redhat.com/drepper/SHA-crypt.txt

这是我第一次做任何与加密有关的事情,所以我想确保我正确理解这些步骤......我不太了解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++;
}

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

2 个答案:

答案 0 :(得分:3)

Salting就像在输入字符串的末尾附加固定的字节字符串一样简单。基本上为您的输入提供已知的“本土”变换。

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

答案 1 :(得分:3)

我会为稍后可能会遇到此问题的其他人添加一些重要的说明。

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

密码存储/密钥生成算法是专门创建的,以使其强大的数量级更加昂贵。这种方式的典型方法是以某种方式迭代底层哈希算法。但是,你自己并不想这样......这会把我们带到......

第二: 不要编写自己的加密方法。 (see this)即使你确切知道自己在做什么,也有很多方法可以解决这个问题。

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