c ++ — конвертировать php код в C (алгоритм sha1)

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 код?
Благодарю.

-2

Решение

Вам нужно выделить достаточно места в строке для объединенной строки. Кроме того, вы не можете изменить 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);

Вы также должны рассмотреть возможность использования std::string вместо массивов символов в C ++.

1

Другие решения

Как насчет:

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 список аргументов.

0