반응형
OpenSSL 및 C ++로 sha256 생성
openssl 및 C ++를 사용하여 sha256으로 해시를 생성하려고합니다. OpenSSL 라이브러리를 사용하여 C ++에서 SHA 해시 생성에 비슷한 게시물이 있다는 것을 알고 있지만 특별히 sha256을 만들려고합니다.
최신 정보:
포함 경로에 문제가있는 것 같습니다. 내가 포함 했는데도 OpenSSL 기능을 찾을 수 없습니다.
#include "openssl/sha.h"
내 빌드에 경로를 포함했습니다.
-I/opt/ssl/include/ -L/opt/ssl/lib/ -lcrypto
내가 한 방법은 다음과 같습니다.
void sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65])
{
int i = 0;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
void sha256_string(char *string, char outputBuffer[65])
{
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, string, strlen(string));
SHA256_Final(hash, &sha256);
int i = 0;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
int sha256_file(char *path, char outputBuffer[65])
{
FILE *file = fopen(path, "rb");
if(!file) return -534;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
const int bufSize = 32768;
unsigned char *buffer = malloc(bufSize);
int bytesRead = 0;
if(!buffer) return ENOMEM;
while((bytesRead = fread(buffer, 1, bufSize, file)))
{
SHA256_Update(&sha256, buffer, bytesRead);
}
SHA256_Final(hash, &sha256);
sha256_hash_string(hash, outputBuffer);
fclose(file);
free(buffer);
return 0;
}
다음과 같이 호출됩니다.
static unsigned char buffer[65];
sha256("string", buffer);
printf("%s\n", buffer);
표준 기반
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
using namespace std;
#include <openssl/sha.h>
string sha256(const string str)
{
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
stringstream ss;
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
ss << hex << setw(2) << setfill('0') << (int)hash[i];
}
return ss.str();
}
int main() {
cout << sha256("1234567890_1") << endl;
cout << sha256("1234567890_2") << endl;
cout << sha256("1234567890_3") << endl;
cout << sha256("1234567890_4") << endl;
return 0;
}
OpenSSL의 EVP 인터페이스 사용 (다음은 OpenSSL 1.1 용) :
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <openssl/evp.h>
bool computeHash(const std::string& unhashed, std::string& hashed)
{
bool success = false;
EVP_MD_CTX* context = EVP_MD_CTX_new();
if(context != NULL)
{
if(EVP_DigestInit_ex(context, EVP_sha256(), NULL))
{
if(EVP_DigestUpdate(context, unhashed.c_str(), unhashed.length()))
{
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned int lengthOfHash = 0;
if(EVP_DigestFinal_ex(context, hash, &lengthOfHash))
{
std::stringstream ss;
for(unsigned int i = 0; i < lengthOfHash; ++i)
{
ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];
}
hashed = ss.str();
success = true;
}
}
}
EVP_MD_CTX_free(context);
}
return success;
}
int main(int, char**)
{
std::string pw1 = "password1", pw1hashed;
std::string pw2 = "password2", pw2hashed;
std::string pw3 = "password3", pw3hashed;
std::string pw4 = "password4", pw4hashed;
hashPassword(pw1, pw1hashed);
hashPassword(pw2, pw2hashed);
hashPassword(pw3, pw3hashed);
hashPassword(pw4, pw4hashed);
std::cout << pw1hashed << std::endl;
std::cout << pw2hashed << std::endl;
std::cout << pw3hashed << std::endl;
std::cout << pw4hashed << std::endl;
return 0;
}
이 상위 레벨 인터페이스의 장점은 EVP_sha256()
다른 다이제스트 EVP_sha512()
를 사용하기 위해 다른 다이제스트의 함수 (예 :)로 단순히 호출 을 교체해야한다는 것 입니다. 따라서 유연성을 추가합니다.
좀 더 "C ++"버전
#include <iostream>
#include <sstream>
#include "openssl/sha.h"
using namespace std;
string to_hex(unsigned char s) {
stringstream ss;
ss << hex << (int) s;
return ss.str();
}
string sha256(string line) {
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, line.c_str(), line.length());
SHA256_Final(hash, &sha256);
string output = "";
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
output += to_hex(hash[i]);
}
return output;
}
int main() {
cout << sha256("hello, world") << endl;
return 0;
}
I think that you only have to replace SHA1 function with SHA256 function with tatk code from link in Your post
참고URL : https://stackoverflow.com/questions/2262386/generate-sha256-with-openssl-and-c
반응형
'program tip' 카테고리의 다른 글
Android의 여러 테이블 SQLite DB 어댑터? (0) | 2020.12.05 |
---|---|
CPAN 모듈을 로컬 디렉토리에 어떻게 설치할 수 있습니까? (0) | 2020.12.04 |
클래스 이름에 점 (.)으로 요소 스타일 지정 (0) | 2020.12.04 |
mysql 결과를 두 번 확인하는 방법은 무엇입니까? (0) | 2020.12.04 |
document.write없이 HTML 페이지에 JavaScript 변수를 표시하는 방법 (0) | 2020.12.04 |