在 Linux 中解密 RC4

在 Linux 中解密 RC4

我想解密 RC4 加密数据。我试过 openssl,但它不支持我的 64 位密钥长度(我的版本只有 rc4 和 rc4-40)。

加密数据:6dec8a6b6356b36e1f4c1a94c8f6dd5ddfd60108da479d5b4a8794afa468c7e78cd22946d7

密钥:24641684

纯文本应显示为:ThisIstheOriginaltext=theoriginaltext

使用本网站http://rc4.online-domain-tools.com/我能够成功解密数据。但是,如果不使用网站工具,我在 Linux 中解密数据时遇到了困难。

我怎样才能在 Linux 中解密它?

答案1

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 代码文件。

答案2

看起来openssl大多数 Linux 发行版附带的实用程序并未编译支持rc4-64

你可以做的是从 OpenSSL 获取最新的源代码网站并自行编译。

答案3

OpenSSLenc实用程序仅支持rc4默认情况下隐式为 128 位(EVP_rc4()),并且rc4-40EVP_rc4_40())。

前者支持可变密钥大小(通过EVP_CIPHER_CTX_set_key_length()),但似乎enc不支持非默认密钥大小,并且从不调用该设置长度函数。我不知道有任何 CLI 工具或 perl 模块支持此功能。

相反,您可以简单地修改do_crypt()OpenSSL 手册页中的 RC2 80 位示例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;
}

(为简洁明了,省略了错误检查等 -这不是生产代码

相关内容