C 打印SHA256和

C 打印SHA256和,c,sha256,C,Sha256,我正在尝试构建一个C程序来查找一个未知字符串,该字符串等价于给定的SHA256和。最后一个程序应该生成格式为“####ENCRYPTION”的字符串,然后找到它的SHA和,并与已知值进行比较。但是,我在生成SHA和时遇到问题。出于某种原因,我打印总和的方法会丢失1个字符: 000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6**0**c493bafd38baff5 但我的代码生成: 000ENCRYPTION=f6bc21

我正在尝试构建一个C程序来查找一个未知字符串,该字符串等价于给定的SHA256和。最后一个程序应该生成格式为“####ENCRYPTION”的字符串,然后找到它的SHA和,并与已知值进行比较。但是,我在生成SHA和时遇到问题。出于某种原因,我打印总和的方法会丢失1个字符:

000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6**0**c493bafd38baff5
但我的代码生成:

000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6c493bafd38baff5
似乎描述了一个类似的问题,但它不太适合我的问题

我已经用Python构建了一个程序来做同样的事情,但是现在我想用C构建一个程序来比较运行时间。 (我也使用了OSX中的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;
}
#包括
#包括
#包括
int main(){
int c=0;
char*input_sum=“9dcaea0ae17e31d47640cb7c390976d8962823a55ea03fe43b0d061f5624069f”;//当前未使用
char*end=“加密”;
char temp[100];//需要了解有关分配内存的更多信息
无符号字符输出[32];//初始化输出变量
printf(“Sum=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb60c493bafd38baff5\n”);//来自命令行的000个加密的总和
而(c<5){//目前测试限制为5
sprintf(temp,“%03d”,c);//创建前导零
sprintf(temp+3,“%s”,end);//理想情况下,应将附加字符串“end”移到循环外部
C++;
puts(temp);//目视检查cc_sha256中的输入
CC_SHA256(temp,(CC_LONG)strlen(temp),output);//函数执行sha256sum
int i;//for循环将结果字节数组从cc_sha256打印为十六进制;我相信问题就在这里
对于(i=0;i<32;i++){
printf(“%x”,输出[i]);
}
printf(“\n”);
}
返回0;
}

如果输出应为
0c
,则代码仅输出
c
部分。这是因为默认情况下,
printf
以尽可能少的字符数打印结果。在这种情况下,您应该告诉
printf
,如果输入小于
0x10
,则正确的结果总是包含两个十六进制数字,方法是给它一个宽度,并指定零应该放在最重要的半字节中:

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

我试过了。现在它只输出一个零应该位于的空间be@user6023571-很抱歉弄错了,我编辑了我的答案。或者,在某些圈子里,最好是使用
%.2x
做同样的工作(使用
而不是
0
)。我没有挂念它;我使用
0
的频率和使用
的频率一样高(历史上更多,最近更少-我正在慢慢地向
%.2x
迁移,而不是
%02x
)。有什么特别的原因吗?这两种方式都可以编译。我把这两种方法都放在这里是为了提高可视性。您是否意识到,查找散列到特定SHA256散列的给定字符串可能需要平均2^256次试验?查找散列为相同值的两个不同字符串会稍微容易一些,但平均需要2^255次尝试。。。即使每秒可以尝试100000000次,也需要1.8*10^60年才能完成……在这种情况下,哈希字符串的格式是已知的(####加密),因此最多需要1000次尝试。