2011-02-15 64 views
3

我試圖找出方法來編寫以下的OpenSSL命令:的base64文件摘要計算與OpenSSL的

場景:

假設:文件的Base64編碼值(b64.txt)

Base64編碼的sha1文件摘要(正好是該文件的20個字節sha1摘要)。

問題:如果給定文件的摘要是正確的,我必須用C程序進行驗證。

我的方法:

  • 我第一次嘗試的OpenSSL命令編寫代碼之前驗證摘要。這是我如何做到的。
  • 我先解碼了這個base64文件,然後找到了文件的sha1摘要。

我不知道爲什麼我從來沒有得到20byte的值作爲輸出。並與試驗和錯誤只有這些工作:

在Linux系統上,我做了以下內容:

  • base64 -d b64.txt > dec.out(dec.out是文本和二進制(不可破譯的)文本的混合)
  • openssl dgst -sha1 -binary dec.out > sha1.bin(我發現了摘要以二進制形式假設dec.out作爲二進制輸入)
  • base64 sha1.bin > sha1.b64(編碼以base64的SHA1結果)

現在我的sha1.b64給出了一個20byte的摘要,這和給我的一樣。

首先我想知道命令的順序是否正確,以及是否有更簡單的方法。

而且,與EVP_Digest *如何編程這(我的意思是該文件的輸入格式在這些指定?)

請澄清。

謝謝

+0

爲每個句子添加一個新段落使其難以閱讀... – Jason 2011-02-15 09:30:41

回答

1

該命令序列看起來正確。您可以通過使用shell重定向,而不是臨時文件簡化它:

base64 -d b64.txt | openssl dgst -sha1 -binary | base64 

要使用OpenSSL庫做同樣的事情在C,您可以使用BIO抽象,效果良好:

#include <stdio.h> 
#include <openssl/bio.h> 
#include <openssl/evp.h> 

int main(int argc, char *argv[]) 
{ 
    BIO *bio_in, *b64, *md, *bio_out; 
    char buf[1024]; 
    char mdbuf[EVP_MAX_MD_SIZE]; 
    int mdlen; 

    /* setup input BIO chain */ 
    bio_in = BIO_new_fp(stdin, BIO_NOCLOSE); 

    b64 = BIO_new(BIO_f_base64()); 
    bio_in = BIO_push(b64, bio_in); 

    md = BIO_new(BIO_f_md()); 
    BIO_set_md(md, EVP_sha1()); 
    bio_in = BIO_push(md, bio_in); 

    /* reading through the MD BIO calculates the digest */ 
    while (BIO_read(bio_in, buf, sizeof buf) > 0) 
     ; 

    /* retrieve the message digest */ 
    mdlen = BIO_gets(md, mdbuf, sizeof mdbuf); 

    /* setup output BIO chain */ 
    bio_out = BIO_new_fp(stdout, BIO_NOCLOSE); 

    b64 = BIO_new(BIO_f_base64()); 
    bio_out = BIO_push(b64, bio_out); 

    /* write out digest */ 
    BIO_write(bio_out, mdbuf, mdlen); 
    BIO_flush(bio_out); 

    BIO_free_all(bio_in); 
    BIO_free_all(bio_out); 

    return 0; 
} 

的上述程序將讀取stdin上的base64輸入,並將base64編碼的SHA1哈希寫入stdout