SHA1 消息摘要到纯文本

SHA1 Message digest to plain-text

如何将消息摘要转换为纯文本(取回原始消息)。我使用以下函数计算消息摘要。 SHA1 代码可以在 https://github.com/tylabs/quicksand_lite/blob/master/sha1.c 中找到。我找不到可以为我进行转换的函数。有什么算法可以做到这一点吗?

我也在尝试解密和加密消息,这就是问题所在。

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!

首先,从数学上不可能从消息摘要中恢复原始消息。消息摘要是 量的信息,旨在充当 量信息的一种指纹。例如,在最简单的形式之一中,消息摘要可能只是消息中字符数值的总和。您显然无法仅从其字符的总和中恢复原始消息。 (两条消息是变位词会有相同的总和,所以总和不会告诉你这两条消息中哪一条是原始消息。通过增加一个字符和减少另一个字符而改变的消息将与原始消息具有相同的总和,所以,同样,总和不会区分它们。)这只是一个例子——实际的加密哈希比简单的总和更复杂。

其次,加密散列及其生成的消息摘要通常设计难以反转。旨在很难找到摘要等于给定值的 任何 消息。

如果您想要将消息更改为加密形式然后将其反转的加密函数,您正在寻找 encryptiondecryption ,不是散列或摘要。

如果您事先知道所有可能的消息,您就有了每条消息的列表,您可以为每条消息生成 SHA-1 摘要,希望不会发生冲突(顺便说一句,如果您找到了,请分享)。然后,在接收时,您查找收到的 SHA-1 并将其与已知的可能消息相匹配。

它不安全,因为观察者可以在每个 SHA-1 的响应中识别您系统的行为,或者它可以访问已知消息的数据库。

所以这几乎毫无意义。

您可以为每条消息分配一个任意编号,它的工作原理是一样的,而且会更快更短。