【问题标题】:In a "C" program how can I store a hexadecimal value in a string variable?在“C”程序中,如何将十六进制值存储在字符串变量中?
【发布时间】:2012-05-14 12:08:52
【问题描述】:

我有一个程序,它将输入数据作为明文,然后在 CBC 模式下使用 3DES 方法解密消息。但是这些值在程序中是硬编码的,我想自己提供应该解密的加密值。如何在以下程序中做到这一点?

int main(void)
{
    unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE];
    unsigned char *e = out;
    int len;

    DES_cblock key;
    DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10};
    DES_cblock ivsetup = {0xE1, 0xE2, 0xE3, 0xD4, 0xD5, 0xC6, 0xC7, 0xA8};
    DES_key_schedule keysched;
    DES_cblock ivec;

    memset(in, 0, sizeof(in));
    memset(out, 0, sizeof(out));
    memset(back, 0, sizeof(back));

    RAND_seed(seed, sizeof(DES_cblock));

    DES_random_key(&key);
    DES_set_odd_parity(&key);
    if (DES_set_key_checked((C_Block *)key, &keysched))
    {
        fprintf(stderr, "ERROR: Unable to set key schedule\n");
        exit(1);
    }

    /* 64 bytes of plaintext */

    /* From here, encryption starts for the plaintext below. */

    strcpy(in, "Now is the time for all men to stand up and be counted");

    printf("Plaintext: [%s]\n", in);

    len = strlen(in);
    memcpy(ivec, ivsetup, sizeof(ivsetup));
    DES_ncbc_encrypt(in, out, len, &keysched, &ivec, DES_ENCRYPT);

    printf("Ciphertext:");
    while (*e) printf(" [%02x]", *e++);
    printf("\n");

    /* Till here, encryption is over. After this we have to decrypt
     * the value which has been encoded, but I want to remove all this
     * part and to provide my own encrypted message, and get the
     * proper output.
     */

    memcpy(ivec, ivsetup, sizeof(ivsetup));

    /* The problem I am facing is how to provide the value properly
     * to the parameter "out" and "keysched", which should be of my
     * choice. For "out" I want to provide THIS value:
     * "2DC39619B4450A8C27A3976C50DE5799".
     */

    DES_ncbc_encrypt(out, back, len, &keysched, &ivec, DES_DECRYPT);

    printf("Decrypted Text: [%s]\n", back);

    exit(0);
}

阅读更多:http://blog.fpmurphy.com/2010/04/openssl-des-api.html#ixzz1uqOp1Yhv

【问题讨论】:

  • 你只想打印值吗?
  • 没有。负责加密和解密的函数“DES_ncbc_encrypt”是一个库函数。我只需要将值正确地传递给函数。做不到。
  • 我使用 %s 打印了一次 "out" 的值,并通过迭代每个地址在 while 循环中打印一次,然后使用 %x 再次显示。我得到以下输出: Key= ffbfe7f0 Plaintext: [qwertyuiop[]asdf] 明文长度:16 ivec 加密前:ttxA 0 \ J d Ciphertext 1 : S ? j A D. [53] [96] [19] [fb] [ce] [6a] [f8] [87] [d3] [41] [df] [ed] [44] [2e] [8c] [ c5] 密文 2 : ffbfea00 ivec 解密前: ttxA 0 \ J d 解密文本: [qwertyuiop[]asdf]
  • 为了进行三重 DES 加密/解密,我使用了 openssl 库函数,例如 des_ncbc_encrypt(),它使用 16 个字符的密钥和 16 个字符的向量并实现单个 DES。我可以调用它 3 次并传递参数值并使其作为三重 DES 工作。我正在做的是删除与随机化相关的功能,并以这种方式使用我自己的密钥和向量的硬编码值进行加密:
  • 要进行 3DES 加密/解密,我正在使用 openssl 库函数,例如 des_ncbc_encrypt(),它使用一个密钥和一个 16 个字符的向量并实现单个 DES。我可以调用它 3 次并传递参数值并使其像 3DES 一样工作。我正在做的是我以这种方式使用自己的密钥和向量的硬编码值进行加密: if (DES_set_key_checked((C_Block *)key, &keysched)) { fprintf(stderr, "ERROR1: Unable to set key计划\n");退出(1); } DES_ncbc_encrypt(out, back, len, &keysched, &ivec2,DES_DECRYPT);

标签: c encryption des


【解决方案1】:

阅读C FAQ 20.10。十六进制是一种表示。所有数字在内部以二进制形式存储。你的 DES_cblock 可能是一个 typedef (可能是无符号的!)整数类型。所以,你实际上是一个整数数组。你可以用十进制、十六进制或二进制输入数字——但它们都可以。 Hexadecimal is typically used 在密码学中,因为它有一些符号优势。

【讨论】:

  • DES_cblock 是这样的:typedef unsigned char DES_cblock[8];并且 DES_key_schedule 是一个结构: typedef struct DES_ks { union { DES_cblock cblock; DES_LONG 德龙[2]; } ks[16]; } DES_key_schedule;
  • @Manas:和我预料的一样。您可以传递十进制 254 或十六进制 FE,程序将按预期运行。不要担心代表。如果你愿意,你可以将这些数字放在一个文件中,你可以读回(使用fscanf的整数的适当格式标志),然后填充一个数组并传递它。
  • 我有一个长度为 32 的十六进制数,例如“DC4938C31B9E8B30F32FC0F5EC894E16”。我尝试以两种方式传递它:1)unsigned out[BUFSIZE]={0xA0,0x69,0x57,0x3B,0x70,0x26,0x1C,0xE8,0xEF,0xF2,0x9F,0x60,0x80,0x60,0xB2,0xE5} ; 2)strcpy(输出,“539619fbce6af887d341dfed442e8cc5”);在我尝试显示变量时尝试了两种方式之后,它里面没有存储任何东西,也没有出现任何错误。两者都没有工作。如何将这样的值传递给 unsigned char 变量?
【解决方案2】:

我搞定了。 我暂时以一种幼稚的方式做到了这一点,但它现在正在发挥作用。我是这样做的。

out[0]=0xA0; out[1]=0x69; out[2]=0x57; out[3]=0x3B;
out[4]=0x70; out[5]=0x26; out[6]=0x1C; out[7]=0xE8;
out[8]=0xEF; out[9]=0xF2; out[10]=0x9F;out[11]=0x60;
out[12]=0x80;out[13]=0x60;out[14]=0xB2;out[15]=0xE5;

稍后我将在 for 循环中执行此操作。

【讨论】:

    【解决方案3】:

    像这样创建一个转储函数:

    hexdump(char *buff, int len) { 
      int i,tmp;
      for(i=0; i < len; i++) {
        tmp = buff[i] & 0xff; /** to avoid sign extension */
        printf("%02x",tmp);
      }
    } 
    

    然后使用它。

    hexdump(back,len);
    

    如果必须写在内存中,可以使用sprintf,但可能需要自己编写二进制转十六进制函数。

    【讨论】:

      【解决方案4】:

      使用将值存储为字符串的非标准itoa 函数,您可以执行以下操作:

      char* hexstr = itoa(back,16); 
      
      // print out a string
      printf("Decrypted Text: [%X]\n", back);
      

      【讨论】:

      • itoa() 是一个非标准函数,本质上是sprintf("%d")
      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2019-07-22
      • 2016-08-07
      • 2019-07-27
      相关资源
      最近更新 更多