如何将我的消息摘要转换为纯文本(取回原始消息)。我使用以下函数计算消息摘要。可以在https://github.com/tylabs/quicksand_lite/blob/master/sha1.c中找到SHA1代码,但找不到为我进行转换的函数。有没有可以做到这一点的算法?
我也正在尝试解密和加密消息,这就是问题所在。
int main()
{
char qbits[5];
char rbits[5];
char ID[SIZE]; //User ID
char message[SIZE]; //User message
char shamessage[SIZE]; //The input message digest(sha1 result)
char xor_result[SIZE]; //Sender XOR result---V
char xor_result_receiver[SIZE]; //Receiver XOR result
memset(xor_result, 0, sizeof(char)*SIZE);
memset(xor_result_receiver, 0, sizeof(char)*SIZE);
pairing_t pairing; //The pair of bilinear map
element_t P, Ppub, s, U, Qid, Sid;
mpz_t messagehash;
mpz_init(messagehash);
printf("\n############SETUP############\n");
printf("Please enter rbits:");
scanf("%[0-9]", rbits);
getchar();
printf("\nPlease enter qbits:");
scanf("%[0-9]", qbits);
getchar();
setup_sys(atoi(rbits), atoi(qbits), P, Ppub, pairing, s);
printf("System parameters have been set!\n");
element_printf("P = %B\n", P);
element_printf("Ppub = %B\n", Ppub);
printf("###########EXTRACT###########\n");
element_init_G1(Qid, pairing);
element_init_G1(Sid, pairing);
printf("Plase enter your ID:");
scanf("%[ a-zA-Z0-9+*-!.,&*@{}$#]", ID);
printf("\nID=%s\n", ID);
getchar();
get_private_key(ID, pairing, s, Sid);
get_public_key(ID, pairing, Qid);
printf("##########ENCRPTION##########\n");
printf("\nPlase enter the message to encrypt:");
scanf("%[ a-zA-Z0-9+*-!.,&*@{}$#]", message);
getchar();
printf("The original message=%s", message);
sha_fun(message, shamessage); //Get the message digest
printf("\nThe message hash=%s\n", shamessage);
element_init_G1(U, pairing);
encryption(shamessage, ID, P, Ppub, U, xor_result, pairing);
printf("Send <U,V> to the receiver!\n");
printf("##########DECRYPTION##########");
decryption(Sid, pairing, U, xor_result, xor_result_receiver);
printf("\nThe recovery message digest is %s\n", xor_result_receiver);
printf("The original message digest is %s\n", shamessage);
if (strcmp(xor_result_receiver, shamessage) == 0) {
printf("Yeah!The message has been decrpted!\n");
}
else {
printf("Oops!The message can not be decrpted!\n");
}
//Free space
element_clear(P);
element_clear(Ppub);
element_clear(Qid);
element_clear(Sid);
element_clear(U);
element_clear(s);
pairing_clear(pairing);
return 0;
}
我的输出是消息摘要,但我需要将其显示为纯文本。
############SETUP############
Please enter rbits:6
Please enter qbits:6
System parameters have been set!
P = [456, 103]
Ppub = [176, 88]
###########EXTRACT###########
Plase enter your ID:friedrich12
ID=friedrich12
Private key Sid = [184, 383]
Public key Qid = [99, 84]
##########ENCRPTION##########
Plase enter the message to encrypt:code
The original message=code
The message hash=E6FB06210FAFC02FD7479DDBED2D042CC3A5155E
U = [456, 103]
Public key Qid = [99, 84]
V=3D958162F64322BFC65D7655DFE6B61D89945F35
Send <U,V> to the receiver!
##########DECRYPTION##########
The recovery message digest is E6FB06210FAFC02FD7479DDBED2D042CC3A5155E
The original message digest is E6FB06210FAFC02FD7479DDBED2D042CC3A5155E
Yeah!The message has been decrpted!
答案 0 :(得分:4)
首先,从数学上讲不可能从消息摘要中恢复原始消息。消息摘要是一种少量信息,旨在用作大量信息的一种指纹。例如,在一种最简单的形式中,消息摘要可能只是消息中字符的数值之和。您显然不能仅从其字符的总和中恢复原始消息。 (作为字谜的两个消息的总和相同,因此总和不会告诉您这两个消息中的哪一个是原始消息。通过增加一个字符而减少另一个字符来更改消息,则该消息与原始消息具有相同的总和,因此,再次,总和不会将它们区分开。)这只是一个例子-实际的加密哈希比简单的总和更为复杂。
第二个密码散列及其产生的消息摘要通常是设计的,难以反转。意图很难找到摘要等于给定值的任何消息。
如果您希望使用加密功能将消息转换为隐式形式然后将其反转,则需要的是加密和解密,而不是散列或摘要。
>答案 1 :(得分:0)
如果您事先知道所有可能的消息,则拥有每个消息的列表,可以为每个消息生成SHA-1摘要,希望不会发生冲突(顺便说一句,如果找到了,请分享)。然后,在接收时,您将查找接收到的SHA-1并与已知的可能消息进行匹配。
这是不安全的,因为观察者可以在每个SHA-1的响应中识别系统的行为,或者可以访问已知消息的数据库。
所以几乎没有意义。
您可以为每个消息分配一个任意数字,它的工作原理相同,并且更快,更短。