私は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
答えてくれてありがとうは、 。はい、1点すぎます。しかし、これは私の問題を解決しません。追加ファイルをすべて投稿すると、あなたにとって役に立ちますか? – Draftsman
@Draftsman私はあなたのファイルの内容について完全にはわかりません。あなたのコードから、私は次のことを仮定しています:チッパーファイルには、長いかもしれないが暗号化されていないチッパーが含まれています。その内容のハッシュ値が必要です。 sign.binには、これらの3つのチッパーの1つのハッシュ値が*バイナリ*形式で格納され、提供された公開鍵に属する秘密鍵でさらに暗号化されます。これまでのところ正しいのですか?しかし、sign.binに人間が判読できる形式のハッシュが含まれていても(暗号化されていても)、ptを適用しないでください。 – Aconcagua
あなたは絶対に正しいです!しかし、公開鍵を解読した後では、cipherXX.binからのハッシュ値と同じ量のバイトがありません!私はまた、投稿の最後にファイルを追加しました – Draftsman