2017-06-08 9 views
0

私は3つのバイナリファイルcipher01.bin、cipher02.binとcipher03.binを持っています。 さらに私はsign.binとpubkey.pemファイルを持っています。タスクは、3つの暗号をすべてハッシュし、それを署名と比較することです。したがって私はRSAを使ってpubkey.pemの公開鍵でsign.binを解読しました。ハッシュ暗号とCで署名付きで確認

結果は良好ですが、暗号ハッシュのいずれも署名に属していません。しかし私は知っている、それは私たちの大学からの仕事であるので、署名に属する少なくとも1つの暗号があることを知っている。たぶん私は何かを忘れたかもしれないが、何が分からないのか。ヘルプのあらゆる種類の

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <openssl/sha.h> 
#include <openssl/err.h> 
#include <openssl/evp.h> 
#include <openssl/pem.h> 
#include <openssl/ssl.h> 
#include <openssl/rsa.h> 
#include <openssl/bio.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

/** converts unsigned character to readble string*/ 
char *pt(unsigned char *md) { 
    int i; 
    char *buf = (char*)malloc(sizeof(char)*80); 

    for(int i = 0; i < SHA_DIGEST_LENGTH;i++) { 
    sprintf(&(buf[i*2]),"%02x",md[i]); 
    } 

    return (buf); 
} 

/** returns error */ 
void err_exit(void) { 
    printf("%s\n",ERR_error_string(ERR_get_error(),NULL)); 

    ERR_free_strings(); 
    exit(EXIT_FAILURE); 
} 

/** reads a file */ 
char * readFile(char * filename,long int * filesize) { 
    FILE *fin; 
    char *buf; 

    if((fin=fopen(filename,"r"))==NULL) { 
    printf("Error opening %s.\n",filename); 
    exit(EXIT_FAILURE); 
    } 

    fseek(fin,0L,SEEK_END); 
    *filesize = ftell(fin); 
    rewind(fin); 

    if(!(buf=malloc(*filesize))) { 
    printf("Memory exhausted. Stop.\n"); 
    exit(EXIT_FAILURE); 
    } 


    fread(buf,*filesize,1,fin); 
    fclose(fin); 

    return buf; 
} 

/** hash a file with sha1 */ 
char * hashBinaryFile(char * filename) { 
    long int filesize = 0; 

    EVP_MD_CTX c; 
    unsigned char md[SHA_DIGEST_LENGTH]; 

    ERR_load_crypto_strings(); 

    EVP_MD_CTX_init(&c); 

    /** reads files into buf */ 
    char * buf = readFile(filename,&filesize); 

    if((EVP_DigestInit(&c,EVP_sha1()))==0) { 
    err_exit(); 
    } 

    if((EVP_DigestUpdate(&c,buf,filesize))==0) { 
    err_exit(); 
    } 

    if((EVP_DigestFinal(&c,md,NULL))==0) { 
    err_exit(); 
    } 

    //printf("%s\n",pt(md)); 

    EVP_MD_CTX_cleanup(&c); 
    free(buf); 
    ERR_free_strings(); 

    return pt(md); 

} 

int padding = RSA_PKCS1_PADDING; 

/** loads public key and creates rsa */ 
RSA * createRSAWithFilename(char * filename,int public) { 
    FILE * fp = fopen(filename,"rb"); 

    if(fp == NULL) { 
    printf("Unable to open file %s \n",filename); 
    return NULL;  
    } 

    RSA *rsa= RSA_new() ; 

    if(public) { 
    rsa = PEM_read_RSA_PUBKEY(fp, &rsa,NULL, NULL); 
    } else { 
    rsa = PEM_read_RSAPrivateKey(fp, &rsa,NULL, NULL); 
    } 

    return rsa; 
} 

/** decrypt signature */ 
char * public_decrypt(unsigned char * enc_data,int data_len, unsigned char *decrypted) { 
    RSA * rsa = createRSAWithFilename("archieve/pubkey.pem",1); 
    int result = RSA_public_decrypt(data_len,enc_data,decrypted,rsa,padding); 
    return pt(decrypted); 
} 

int main(int argc,char *argv[]) { 
    /** decrypt signature */ 
    long int encrypted_length; 
    long int decrypted_length; 
    unsigned char decrypted[4098]={}; 
    char * encrypted = readFile("archieve/s72897-sig.bin",&encrypted_length); 
    char * sign = public_decrypt(encrypted,encrypted_length, decrypted); 

    char * cipher01 = hashBinaryFile("archieve/s72897-cipher01.bin"); 
    char * cipher02 = hashBinaryFile("archieve/s72897-cipher02.bin"); 
    char * cipher03 = hashBinaryFile("archieve/s72897-cipher03.bin"); 

    if(strcmp(sign,cipher01)==0) { 
    printf("cipher01\n"); 
    } else if(strcmp(sign,cipher02)==0) { 
    printf("cipher02\n"); 
    } else if(strcmp(sign,cipher03)==0) { 
    printf("cipher03\n"); 
    } else { 
    printf("No cipher matches the signature\n"); 
    } 

    return 0; 
} 

ありがとう:

ここでは、これまでに私のコードです。

編集:あなたが実際にいくつかのメモリを持って、さらに

char * public_decrypt(...) 
{ 
    return pt(decrypted); 
    // ^
} 

int main(int argc,char *argv[]) 
{ 
    char * sign = pt(public_decrypt(encrypted,encrypted_length, decrypted)); 
    //   ^

:あなたは二回、人間が読める形式でファイルを変換https://ufile.io/tqwoh

答えて

2

* .zipファイルへのリンク:いくつかのコード

EDIT2を固定しましたリーク:public_decryptでrsaインスタンスを解放しないでください。返される文字列(暗号化されたsign、cypher0 x)を解放しないでください...

PT用で

さらなる勧告:

char *buf = (char*)malloc(sizeof(char) * 2 * SHA_DIGEST_LENGTH); 

すでに適切な定数を持っている場合は、それを使用する... sizeof(char)は常に定義上1であるので、あなたがそれをドロップすることができ...

+0

答えてくれてありがとうは、 。はい、1点すぎます。しかし、これは私の問題を解決しません。追加ファイルをすべて投稿すると、あなたにとって役に立ちますか? – Draftsman

+0

@Draftsman私はあなたのファイルの内容について完全にはわかりません。あなたのコードから、私は次のことを仮定しています:チッパーファイルには、長いかもしれないが暗号化されていないチッパーが含まれています。その内容のハッシュ値が必要です。 sign.binには、これらの3つのチッパーの1つのハッシュ値が*バイナリ*形式で格納され、提供された公開鍵に属する秘密鍵でさらに暗号化されます。これまでのところ正しいのですか?しかし、sign.binに人間が判読できる形式のハッシュが含まれていても(暗号化されていても)、ptを適用しないでください。 – Aconcagua

+0

あなたは絶対に正しいです!しかし、公開鍵を解読した後では、cipherXX.binからのハッシュ値と同じ量のバイトがありません!私はまた、投稿の最後にファイルを追加しました – Draftsman

関連する問題