【问题标题】:openssl is acting open to any size keyopenssl 对任何大小的密钥都开放
【发布时间】:2014-04-23 15:43:02
【问题描述】:

openssl 如何使用 key,因为它采用任意大小的密钥(1 字节到任意大小)。在这里进入实际密钥的程序是什么..

openssl enc -d -des-ecb -in cipher.txt -out text.out -K '530343412312345445123345677812345678812324' 

【问题讨论】:

    标签: cryptography openssl pyopenssl


    【解决方案1】:

    openssl 是如何与 key 一起工作的……程序是什么……

    这取决于程序,但程序通常在整个库中是一致的。在您的示例中,您使用的是openssl dec,因此您使用的是dec 子程序。源代码在<openssl dir>/apps/enc.c 中提供(encdecenc.c 的一部分)。

    以下是相关部分:

    unsigned char key[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH];
    unsigned char salt[PKCS5_SALT_LEN];
    ...
    char *hkey=NULL,*hiv=NULL,*hsalt = NULL;
    

    -K 的参数存储在hkey

    else if (strcmp(*argv,"-K") == 0)
    {
        if (--argc < 1) goto bad;
        hkey= *(++argv);
    }
    

    然后,在第 580 行附近:

    if ((hkey != NULL) && !set_hex(hkey,key,sizeof key))
    {
        /* Handle failure */
    }
    

    set_hex 如下所示,十六进制解码通过-K 传入的参数。它通过memset 用0 填充未使用的长度。未使用的长度是 EVP_MAX_KEY_LENGTH 减去长度 -K 参数(十六进制解码后)。

    最后,在第 610 行附近:

    if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
    {
        /* Handle failure */
    }
    

    注意-k(小号k)采用不同的代码路径,并使用EVP_BytesToKey 派生密钥。


    int set_hex(char *in, unsigned char *out, int size)
    {
        int i,n;
        unsigned char j;
    
        n=strlen(in);
        if (n > (size*2))
        {
            BIO_printf(bio_err,"hex string is too long\n");
            return(0);
        }
        memset(out,0,size);
        for (i=0; i<n; i++)
        {
            j=(unsigned char)*in;
            *(in++)='\0';
            if (j == 0) break;
            if ((j >= '0') && (j <= '9'))
                j-='0';
            else if ((j >= 'A') && (j <= 'F'))
                j=j-'A'+10;
            else if ((j >= 'a') && (j <= 'f'))
                j=j-'a'+10;
            else
            {
                BIO_printf(bio_err,"non-hex digit\n");
                return(0);
            }
            if (i&1)
                out[i/2]|=j;
            else
                out[i/2]=(j<<4);
        }
        return(1);
    }
    

    【讨论】:

    • 我实际上无法弄清楚 EVP_BytesToKey 为 DES 派生了 8 字节密钥或实际 7 字节密钥。第一种方法,“-K”十六进制密钥采用 8 字节密钥并将每个字节的最后一位视为奇偶校验。你能弄清楚这个吗
    【解决方案2】:

    我对该案的观察得出以下结论:

    1. 采用十六进制值
    2. 如果大小小于 8 字节,则填充 0
    3. 前 8 个字节作为 key

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2020-06-25
      • 2020-03-15
      • 1970-01-01
      • 2016-07-31
      相关资源
      最近更新 更多