【问题标题】:convert php code to C (sha1 algorithm)将php代码转换为C(sha1算法)
【发布时间】:2014-12-04 09:24:49
【问题描述】:

PHP代码:

<?php
$pass = "12345678";
$salt = "1234";
echo sha1($salt.$pass.$salt);
?>

我的C 代码使用SHA1 使用openSSL 加密库:http://www.openssl.org/docs/crypto/sha.html

#include <openssl/sha.h>

int main()
{  
  const char str[] = "Original String";
  const char salt[] = "1234";
  const char pass[] = "12345678";
  strcat(str, salt, pass);
  unsigned char hash[SHA_DIGEST_LENGTH]; // == 20

  SHA1(str, sizeof(str) - 1, hash);

  // do some stuff with the hash

  return 0;
}

我的问题是,如何将C 代码修改为与PHP 代码完全相同的内容? 谢谢。

【问题讨论】:

  • 使用strcat() 连接盐?
  • @Barmar 我不太懂 C,如果你能告诉我怎么做,我会很感激的。
  • 没有。请自己尝试解决,如果它不起作用,我们将帮助您修复它。这就是你学习的方式。
  • StackOverflow 不是代码编写服务。
  • @Barmar 我添加了代码更改,我现在可以寻求帮助吗?我尽力分配适当的变量并尝试使用 strcat。如何将 strcat 的结果转换为一个变量,然后我可以在 SHA1 函数中使用?

标签: php c++ cryptography converter sha1


【解决方案1】:

您需要在字符串中为连接的字符串分配足够的空间。此外,您不能修改 const char,因此不要在要连接的变量上使用该修饰符。

char str[17] = ""; // 16 characters plus null terminator
const char salt[] = "1234";
const char pass[] = "12345678";
unsigned char hash[SHA_DIGEST_LENGTH+1]; // +1 for null terminator

strcpy(str, salt);
strcat(str, pass); // strcat() only takes 2 arguments, you need to call it twice
strcat(str, salt);

SHA1(str, strlen(str), hash);

您还应该考虑在 C++ 中使用 std::string 而不是 char 数组。

【讨论】:

    【解决方案2】:

    怎么样:

    SHA_CTX ctx;
    SHA1_Init(&ctx);
    
    const char salt[] = "1234";
    const char pass[] = "12345678";
    
    SHA1_Update(&ctx, salt, strlen(salt));
    SHA1_Update(&ctx, pass, strlen(pass));
    SHA1_Update(&ctx, salt, strlen(salt));
    unsigned char hash[SHA_DIGEST_LENGTH];
    SHA1_Final(hash, &ctx);
    

    不需要中间级联字符串。散列大小的常数已经存在。并且可以使用strlen 检索字符串的大小。

    此外,在密码学中,将字节表示为 C 中的无符号字符很有用 - 这也是 SHA1_Final 参数列表中的散列类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多