我正在尝试构建一个C程序来查找等效于给定SHA256总和的未知字符串。最终的程序应该生成格式的字符串" ### ENCRYPTION,"然后找到它的SHA总和并与已知值进行比较。但是,我在生成SHA总和时遇到问题。出于某种原因,我打印总和的方法有1个字符:
000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6**0**c493bafd38baff5
但我的代码生成:
000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6c493bafd38baff5
This link似乎似乎描述了一个类似的问题,但它并不适合我的问题。
我已经用Python构建了一个程序来做同样的事情,但现在我想在C中构建一个程序来比较运行时间。 (我还使用了OS X中的CommonCrypto库,但OpenSSL也可以使用。)
非常感谢任何帮助!
#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 :(得分:0)
如果输出应为0c
,则代码仅输出c
部分。这是因为默认情况下printf
以尽可能少的字符数打印结果。在这种情况下,您应该告诉printf
正确的结果总是包含两个十六进制数字,方法是给它一个宽度,并指定如果输入小于{{{},则应将零置于最重要的半字节中。 1}}:
0x10