1

Я хочу расшифровать зашифрованные данные RC4. Я пробовал openssl, но он не поддерживает мою длину ключа 64 бита (моя версия имеет только rc4 и rc4-40).

Зашифрованные данные:6dec8a6b6356b36e1f4c1a94c8f6dd5ddfd60108da479d5b4a8794afa468c7e78cd22946d7

Ключ: 24641684

Обычный текст должен выходить по адресу: ThisIstheOriginaltext = theoriginaltext

Используя этот сайт http://rc4.online-domain-tools.com/ Я могу успешно расшифровать данные. Однако я изо всех сил пытаюсь расшифровать его в Linux без использования инструмента веб-сайта.

Как я могу расшифровать это в Linux?

3 ответа3

2

RC4? Это должно быть легко. Существует очень короткая версия c, которая поддерживает любую длину ключа (в шестнадцатеричном коде). Просто скомпилируйте так:

$ gcc -o rc4 -O4 rc4.c

этот код:

#define S ,t=s[i],s[i]=s[j],s[j]=t /* rc4 hexkey <file */
unsigned char k[256],s[256],i,j,t;main(c,v,e)char**v;{++v;while(++i)s[
i]=i;for(c=0;*(*v)++;k[c++]=e)sscanf((*v)++-1,"%2x",&e);while(j+=s[i]
+k[i%c]S,++i);for(j=0;c=~getchar();putchar(~c^s[t+=s[i]]))j+=s[++i]S;}

Использование это:

$ rc4 hexkey < input > output

Бесстыдно скопировано с этого сайта:

Если вам нужна / нужна длинная версия, используйте это.
Этот более надежный, чуть больше, так как это 2k-файл кода c.

1

Похоже, что утилита openssl которая поставляется с большинством дистрибутивов Linux, не была скомпилирована с поддержкой rc4-64 .

Что вы можете сделать, это взять последний исходный код с веб-сайта OpenSSL и скомпилировать его самостоятельно.

1

Утилита OpenSSL enc поддерживает только rc4, который по умолчанию неявно 128-битный (EVP_rc4()), и rc4-40 (EVP_rc4_40()).

Первый поддерживает переменные размеры ключей (через EVP_CIPHER_CTX_set_key_length()), но кажется, что enc не поддерживает нестандартные размеры ключей и никогда не вызывает эту функцию установленной длины. Я не знаю ни о каком инструменте CLI или модуле perl, который поддерживает это.

Вместо этого вы можете тривиально изменить 80-битный пример do_crypt() RC2 в справочной странице OpenSSL EVP_EncryptInit чтобы сделать RC4-64 (или любой другой поддерживаемый размер):

// compile with: gcc -lcrypto -o rc4-64 rc4-64.c 
#include <stdio.h>
#include <openssl/ssl.h>

int main(int argc, char * argv[]) {
    FILE *in,*out; 

    // encrypt
    //in=fopen("rc4.in","r");
    //out=fopen("rc4.out","w");
    //do_crypt(in,out,1);
    //fclose(in); 
    //fclose(out);

    // decrypt
    in=fopen("rc4.out","r");
    out=fopen("rc4.txt","w");
    do_crypt(in,out,0);
    fclose(in); 
    fclose(out);
}

int do_crypt(FILE *in, FILE *out, int do_encrypt)
{
    /* Allow enough space in output buffer for additional block */
    unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
    int inlen, outlen;
    EVP_CIPHER_CTX ctx;

    /* Bogus key and IV: we'd normally set these from
       * another source.  */
    //unsigned char key[] = "0123456789";
    //unsigned char iv[] = "12345678";
    unsigned char key[] = "24641684";
    unsigned char iv[] = "\0\0\0\0\0\0\0\0";

    /* Don't set key or IV because we will modify the parameters */
    EVP_CIPHER_CTX_init(&ctx);

    /* set RC4 with 64-bit key */
    EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, NULL, NULL, do_encrypt);
    EVP_CIPHER_CTX_set_key_length(&ctx, 64/8)

    /* We finished modifying parameters so now we can set key and IV */

    EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, do_encrypt);
    for(;;) {
        inlen = fread(inbuf, 1, 1024, in);
        if(inlen <= 0) break;
        if(!EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) {
            /* Error */
            EVP_CIPHER_CTX_cleanup(&ctx);
            return 0;
        }
        fwrite(outbuf, 1, outlen, out);
    }
    if(!EVP_CipherFinal_ex(&ctx, outbuf, &outlen)) {
        /* Error */
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    fwrite(outbuf, 1, outlen, out);
    EVP_CIPHER_CTX_cleanup(&ctx);
    return 1;
}

(Проверка ошибок и т.д. Для краткости и ясности опущена - это не рабочий код)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .