SHA1邮件摘要转换为纯文本

时间:2018-07-24 13:50:54

标签: c encryption sha

如何将我的消息摘要转换为纯文本(取回原始消息)。我使用以下函数计算消息摘要。可以在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!

2 个答案:

答案 0 :(得分:4)

首先,从数学上讲不可能从消息摘要中恢复原始消息。消息摘要是一种少量信息,旨在用作大量信息的一种指纹。例如,在一种最简单的形式中,消息摘要可能只是消息中字符的数值之和。您显然不能仅从其字符的总和中恢复原始消息。 (作为字谜的两个消息的总和相同,因此总和不会告诉您这两个消息中的哪一个是原始消息。通过增加一个字符而减少另一个字符来更改消息,则该消息与原始消息具有相同的总和,因此,再次,总和不会将它们区分开。)这只是一个例子-实际的加密哈希比简单的总和更为复杂。

第二个密码散列及其产生的消息摘要通常是设计的,难以反转。意图很难找到摘要等于给定值的任何消息。

如果您希望使用加密功能将消息转换为隐式形式然后将其反转,则需要的是加密解密,而不是散列或摘要。

>

答案 1 :(得分:0)

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

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

所以几乎没有意义。

您可以为每个消息分配一个任意数字,它的工作原理相同,并且更快,更短。