2016-04-01 6 views
0

私はCプログラムを構築して、与えられたSHA256の和と同等の未知の文字列を見つけようとしています。最終的なプログラムは "### ENCRYPTION"という形式の文字列を生成し、SHAの和を見つけて既知の値と比較する必要があります。しかし、SHA合計を生成するだけの問題があります。 SHA256の和を出力する

000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6**0**c493bafd38baff5 

しかし、私のコードが生成します:何らかの理由で、合計を印刷する私の方法は、1つの文字をドロップアウトする

000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6c493bafd38baff5 

This linkは、同様の問題を記述するように思われるようですが、それはかなり私に合いません問題。

私はすでに同じことをするためにPythonでプログラムを構築しましたが、今は実行時間を比較するためにC言語でビルドしたいと考えています。 (OS XのCommonCryptoライブラリも使用しましたが、OpenSSLも同様に動作します)

ご協力いただければ幸いです!出力は0cあるべき

#include <stdio.h> 
#include <CommonCrypto/CommonDigest.h> 
#include <string.h> 

int main() { 
int c=0; 
char *input_sum="9dcaea0ae17e31d47640cb7c390976d8962823a55ea03fe43b0d061f5624069f"; // currently unused 
char *end="ENCRYPTION"; 
char temp[100]; // need to learn more about allocating memory 
unsigned char output[32]; // initializes output variable 

printf("Sum=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb60c493bafd38baff5\n"); // Sum of 000ENCRYPTION from command line 

while(c < 5) { // limited to 5 right now for testing 
    sprintf(temp, "%03d", c); // creates leading zeros 
    sprintf(temp + 3, "%s", end); // appends string "end"; should ideally be moved outside loop 
    c++; 
    puts(temp); // visual check of input into cc_sha256 

    CC_SHA256(temp, (CC_LONG)strlen(temp), output); // function does sha256sum 

    int i; // for loop prints resulting byte array from cc_sha256 to hex; I believe the problem is here 
    for (i = 0; i < 32; i++) { 
     printf("%x", output[i]); 
    } 
    printf("\n"); 

} 
return 0; 
} 
+0

いずれかの方法でコンパイルされます。可視性を向上させるために両方を置く – MEcoder

+0

特定のSHA256ハッシュをハッシュする特定の文字列を見つけることは、平均2^256回の試行を必要とすると思いますか?同じ値にハッシュする2つの異なる文字列を見つけることはやや簡単ですが、平均しても2^255の試行が必要です...毎秒1,000,000,000回試すことができても、1.8 * 10^60 ... – twalberg

+0

この場合、ハッシュされた文字列の形式は(### ENCRYPTION)であるため、最大1000回の試行が必要になります。 – MEcoder

答えて

0

、あなたのコードはc一部を出力します。これは、デフォルトでprintfが可能な最小文字数で結果を出力するためです。この場合、printfに適切な結果に常に2つの16進数字が含まれていることを伝え、入力が0x10未満の場合は0を入力するように指定します。

printf("%02x", output[i]); 
+0

それを試してみてください。今度は、ゼロが0でなければならないスペースを出力します。 – MEcoder

+0

printf( "%02x"、output [i]);動作するようです。ありがとう! – MEcoder

+0

@ user6023571 - 間違って申し訳ありませんが、私は自分の答えを編集しました。 – owacoder

関連する問題