=pod

=head1 NAME

RC4_set_key, RC4 - RC4 encryption

=head1 SYNOPSIS

 #include <openssl/rc4.h>

The following functions have been deprecated since OpenSSL 3.0, and can be
hidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
see L<openssl_user_macros(7)>:

 void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);

 void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata,
          unsigned char *outdata);

=head1 DESCRIPTION

All of the functions described on this page are deprecated. Applications should
instead use L<EVP_EncryptInit_ex(3)>, L<EVP_EncryptUpdate(3)> and
L<EVP_EncryptFinal_ex(3)> or the equivalently named decrypt functions.

This library implements the Alleged RC4 cipher, which is described for
example in I<Applied Cryptography>.  It is believed to be compatible
with RC4[TM], a proprietary cipher of RSA Security Inc.

RC4 is a stream cipher with variable key length.  Typically, 128 bit
(16 byte) keys are used for strong encryption, but shorter insecure
key sizes have been widely used due to export restrictions.

RC4 consists of a key setup phase and the actual encryption or
decryption phase.

RC4_set_key() sets up the B<RC4_KEY> B<key> using the B<len> bytes long
key at B<data>.

RC4() encrypts or decrypts the B<len> bytes of data at B<indata> using
B<key> and places the result at B<outdata>.  Repeated RC4() calls with
the same B<key> yield a continuous key stream.

Since RC4 is a stream cipher (the input is XORed with a pseudo-random
key stream to produce the output), decryption uses the same function
calls as encryption.

=head1 RETURN VALUES

RC4_set_key() and RC4() do not return values.

=head1 NOTE

Applications should use the higher level functions
L<EVP_EncryptInit(3)> etc. instead of calling these
functions directly.

It is difficult to securely use stream ciphers. For example, do not perform
multiple encryptions using the same key stream.

=head1 SEE ALSO

L<EVP_EncryptInit(3)>

=head1 HISTORY

All of these functions were deprecated in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
