c - SHA1 消息摘要到纯文本

标签 c encryption sha

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

最佳答案

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

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

如果您想要将消息更改为加密形式然后将其反转的加密函数,您需要的是加密解密,而不是散列或摘要。

关于c - SHA1 消息摘要到纯文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51500378/

相关文章:

在使用 fscanf 操作之前检查字符串的大小?

java - 移位密码错误地移位了一些字符

encryption - 如何找到哈希的可能性数

ssl - 什么版本的wget支持SHA2

java - Java 中的 HMAC SHA-384

c - 创建列表过程中出现的问题

c - 生成 K 个数字中 6 个的所有可能组合

c++ - int32 溢出后可能的值是多少?

php - 如何在PHP中加密和解密图像文件?

php - 在创建 JWT token 期间了解 RS256 和 SHA256