我想解密 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-40(EVP_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;
}
(为简洁明了,省略了错误检查等 -这不是生产代码)