이 코드가 올바른 해시를 생성하지 않는 이유는 무엇입니까?

제이손

저는 C로 작은 암호 해독 프로그램을 작성하여 "resource.bin"이라는 한 파일에서 키를 강제로 강제 실행하고이 프로그램을 사용하여 DES-EDE (여기서는 "rom_dump.bin")를 사용하여 다른 파일의 암호를 해독해야했습니다. 올바른 키에 대한 표시는 해독 된 파일 내용이로 끝나는 10 자리 숫자로 시작한다는 것 \0입니다. 그 후 복호화 된 콘텐츠를 다른 파일 (여기서는 "decrypted.bin")에 기록하고 파일은 ECDSA (함수 사용 EVP_ecdsa()) 로 해시해야합니다 . 이 모든 작업은 SUSE Linux에서 수행됩니다. 파일은 여기에서 찾을 수 있습니다.

https://spideroak.com/browse/share/see/stack/StackOverflow/

이제 암호 해독은 잘 작동하지만 해시 값이 올바르지 않습니다.

a493af52c1a000fcace34de8b0a74a9cf9067ffc

그러나 며칠 동안 검색해도 문제를 찾을 수 없습니다. 내가 감독하고있는 것은 아마 잊을 수없는 일이지만 누군가가 나를 도울 수 있다면 매우 기쁠 것입니다. 미리 감사드립니다.

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <unistd.h>
#include <fcntl.h>

const unsigned long long bufferSize = 0x10000;

int checkOutput(unsigned char *output) {
    int i = 0;
    for (i; i < 6; i++) {
        if (!isdigit(output[i])) {
            return 0;
        }
    }

    return 1;
}

void changeKey(unsigned char *key, unsigned char *fileContent, long keyLength,
long initVectorLength) {
    int i = 0;
    for (i; i < keyLength + initVectorLength; i++) {
        key[i] = fileContent[i];
    }
}

void toHashFile(FILE *hashFile, unsigned char *hash, int hashLength) {
    int i = 0;
    for (i; i < hashLength; i++) {
        fprintf(hashFile, "%02x", hash[i]);
    }

    fprintf(hashFile, "\n");
}

void toOutputFile(FILE *fileName, unsigned char *output,
int outputLength) {
    int i = 0;
    for (i; i < outputLength; i++) {
        fprintf(fileName, "%c", output[i]);
    }

    fprintf(fileName, "\n");
}

void writeToFile(const unsigned char *fileName, unsigned char *content,
int contentLength,
void (*functionPointer)(FILE *, unsigned char *, int)) {
    FILE *file = fopen(fileName, "w");
    (*functionPointer)(file, content, contentLength);
    fclose(file);
}

void createHash(unsigned char *hash, unsigned char *output, int length,
int *hashLength) {
    EVP_MD_CTX hashContext;
    EVP_MD_CTX_init(&hashContext);
    EVP_DigestInit(&hashContext, EVP_ecdsa());
    EVP_DigestUpdate(&hashContext, output, length);
    EVP_DigestFinal(&hashContext, hash, hashLength);
}

int main() {
    /* output stuff */
    unsigned char keyAndInitVector[24] = {0x00};
    unsigned char output[bufferSize];
    unsigned char outputFinal[bufferSize];
    int outputLength;

    /* determine key length and init vector */
    int initVectorLength = EVP_CIPHER_iv_length(EVP_des_ede_ecb());
    int keyLength = EVP_CIPHER_key_length(EVP_des_ede_ecb());

    /* read resource files */
    unsigned char romFileContent[bufferSize];
    unsigned char resFileContent[bufferSize];
    int romLength = read(open("rom_dump.bin", O_RDONLY), romFileContent,
        bufferSize);
    int resLength = read(open("resource.bin", O_RDONLY), resFileContent,
        bufferSize);

    /* init context */
    EVP_CIPHER_CTX cypherContext;
    EVP_CIPHER_CTX_init(&cypherContext);

    int i = 0, j;
    int isDecrypted = 0;

    for (i; i < romLength - (keyLength + initVectorLength) &&
    !isDecrypted; i++) {
        changeKey(keyAndInitVector, romFileContent + i, keyLength,
            initVectorLength);

        EVP_DecryptInit(&cypherContext, EVP_des_ede_ecb(),
            keyAndInitVector, keyAndInitVector + keyLength);
        EVP_DecryptUpdate(&cypherContext, output, &outputLength,
            resFileContent, resLength);

        for (j = 0; j < resLength; j++) {
            if (checkOutput(output + j) == 1) {
                isDecrypted = 1;
                break;
            }
        }
    }

    if (isDecrypted) {
        int postfixLength;
        EVP_DecryptFinal(&cypherContext, outputFinal,
            &postfixLength);

        writeToFile("decrypted.bin", output,
            outputLength + postfixLength, &toOutputFile);

        int hashLength = 0;
        unsigned char hash[bufferSize];
        createHash(hash, output, outputLength + postfixLength,
            &hashLength);
        writeToFile("hash.txt", hash, hashLength, &toHashFile);
    }

    EVP_CIPHER_CTX_cleanup(&cypherContext);
    return isDecrypted;
}
스 태키

당신의에서 toOutputFile()기능, 당신은 추가 \n파일에 있지만 아래로 main()그렇지 파일을 해시를 수행하지만 output.

즉, 파일에 존재하지 않는 decrypted.bin추가 항목 \noutput있으므로 파일을 해시 할 때 해시가 해당 프로그램으로 만든 것과 다릅니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이 코드가 올바른 결과를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

내 코드가 올바른 최소 차이를 인쇄하지 않는 이유는 무엇입니까?

분류에서Dev

GCC가 int 나누기에 대해 올바른 어셈블리 코드를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

한 코드가 firebase에서 올바른 키를 제공하고 다른 코드는 제공하지 않는 이유는 무엇입니까?

분류에서Dev

이 코드가 올바른 출력을 제공하지 않는 이유는 무엇입니까?

분류에서Dev

PHP가 올바른 배열 수를 표시하지 않는 이유는 무엇입니까?

분류에서Dev

내 js 코드가 올바른 런타임 값을 반영하지 않는 이유는 무엇입니까?

분류에서Dev

핵심 데이터-내 NSPredicate가 올바른 SQL 쿼리를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

SQL Server가 코드를 올바르게 처리하지 않는 이유는 무엇입니까?

분류에서Dev

이 Firebase Function Promise가 올바른 오류를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

이 코드가 원하는 결과를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 방법으로 읽기가 일관된 결과를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

내 editText가 Android에서 올바른 출력을 표시하지 않는 이유는 무엇입니까?

분류에서Dev

React 부트 스트랩에서 올바른 카드를 사용하지 않는 이유는 무엇입니까?

분류에서Dev

copy_to_user가 올바른 결과를 인쇄하지 않는 이유는 무엇입니까?

분류에서Dev

Dig가 올바른 IPv6 DNS 서버를 사용하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 위치에 올바른 문자열을 추가하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 텍스트가 표시되지 않는 이유는 무엇입니까?

분류에서Dev

이 PHP 코드를 수행하는 올바른 방법은 무엇입니까

분류에서Dev

이 코드를 설명하는 올바른 방법은 무엇입니까?

분류에서Dev

올바른 비밀번호를 입력해도 내 페이지가 Google로 리디렉션되지 않는 이유는 무엇입니까? 내 코드를 참조하십시오

분류에서Dev

두 컨테이너의 가시성을 전환하는 다음 코드가 작동하지 않는 이유는 무엇이며 올바른 방법은 무엇입니까?

분류에서Dev

이 코드에 대해 유효하지 않다는 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

이 자바 코드가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 바이트 수를 할당하지 않고 malloc이 작동하는 이유는 무엇입니까?

분류에서Dev

올바른 입력 대문자를 쓰면 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

ScreenManager를 사용하는 올바른 .kv 코드를 외부 .kv 파일에 넣을 때 작동하지 않는 이유는 무엇입니까?

분류에서Dev

이 PHP 코드가 올바른 방법을 삽입하지 않는 이유

분류에서Dev

플롯이 x 축에 올바른 범위를 표시하지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    이 코드가 올바른 결과를 반환하지 않는 이유는 무엇입니까?

  2. 2

    내 코드가 올바른 최소 차이를 인쇄하지 않는 이유는 무엇입니까?

  3. 3

    GCC가 int 나누기에 대해 올바른 어셈블리 코드를 생성하지 않는 이유는 무엇입니까?

  4. 4

    한 코드가 firebase에서 올바른 키를 제공하고 다른 코드는 제공하지 않는 이유는 무엇입니까?

  5. 5

    이 코드가 올바른 출력을 제공하지 않는 이유는 무엇입니까?

  6. 6

    PHP가 올바른 배열 수를 표시하지 않는 이유는 무엇입니까?

  7. 7

    내 js 코드가 올바른 런타임 값을 반영하지 않는 이유는 무엇입니까?

  8. 8

    핵심 데이터-내 NSPredicate가 올바른 SQL 쿼리를 생성하지 않는 이유는 무엇입니까?

  9. 9

    SQL Server가 코드를 올바르게 처리하지 않는 이유는 무엇입니까?

  10. 10

    이 Firebase Function Promise가 올바른 오류를 반환하지 않는 이유는 무엇입니까?

  11. 11

    이 코드가 원하는 결과를 생성하지 않는 이유는 무엇입니까?

  12. 12

    올바른 방법으로 읽기가 일관된 결과를 생성하지 않는 이유는 무엇입니까?

  13. 13

    내 editText가 Android에서 올바른 출력을 표시하지 않는 이유는 무엇입니까?

  14. 14

    React 부트 스트랩에서 올바른 카드를 사용하지 않는 이유는 무엇입니까?

  15. 15

    copy_to_user가 올바른 결과를 인쇄하지 않는 이유는 무엇입니까?

  16. 16

    Dig가 올바른 IPv6 DNS 서버를 사용하지 않는 이유는 무엇입니까?

  17. 17

    올바른 위치에 올바른 문자열을 추가하지 않는 이유는 무엇입니까?

  18. 18

    올바른 텍스트가 표시되지 않는 이유는 무엇입니까?

  19. 19

    이 PHP 코드를 수행하는 올바른 방법은 무엇입니까

  20. 20

    이 코드를 설명하는 올바른 방법은 무엇입니까?

  21. 21

    올바른 비밀번호를 입력해도 내 페이지가 Google로 리디렉션되지 않는 이유는 무엇입니까? 내 코드를 참조하십시오

  22. 22

    두 컨테이너의 가시성을 전환하는 다음 코드가 작동하지 않는 이유는 무엇이며 올바른 방법은 무엇입니까?

  23. 23

    이 코드에 대해 유효하지 않다는 오류가 발생하는 이유는 무엇입니까?

  24. 24

    이 자바 코드가 작동하지 않는 이유는 무엇입니까?

  25. 25

    올바른 바이트 수를 할당하지 않고 malloc이 작동하는 이유는 무엇입니까?

  26. 26

    올바른 입력 대문자를 쓰면 오류가 발생하는 이유는 무엇입니까?

  27. 27

    ScreenManager를 사용하는 올바른 .kv 코드를 외부 .kv 파일에 넣을 때 작동하지 않는 이유는 무엇입니까?

  28. 28

    이 PHP 코드가 올바른 방법을 삽입하지 않는 이유

  29. 29

    플롯이 x 축에 올바른 범위를 표시하지 않는 이유는 무엇입니까?

뜨겁다태그

보관