Утилита 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;
}
(Проверка ошибок и т.д. Для краткости и ясности опущена - это не рабочий код)