Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.00% covered (success)
95.00%
19 / 20
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Rc4Cipher
95.00% covered (success)
95.00%
19 / 20
66.67% covered (warning)
66.67%
2 / 3
6
0.00% covered (danger)
0.00%
0 / 1
 encrypt
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 decrypt
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 rc4
94.44% covered (success)
94.44%
17 / 18
0.00% covered (danger)
0.00%
0 / 1
4.00
1<?php
2
3declare(strict_types=1);
4
5namespace Phpdftk\Crypt;
6
7/**
8 * RC4 stream cipher for legacy PDF encryption (PDF 1.1–1.5).
9 *
10 * Encrypt and decrypt are the same XOR operation. Retained for
11 * reading older PDFs — AES should be used for all new documents.
12 */
13final class Rc4Cipher implements CryptInterface
14{
15    public function encrypt(string $data, string $key): string
16    {
17        return self::rc4($data, $key);
18    }
19
20    public function decrypt(string $data, string $key): string
21    {
22        return self::rc4($data, $key);
23    }
24
25    private static function rc4(string $data, string $key): string
26    {
27        $keyLen = strlen($key);
28        if ($keyLen === 0) {
29            return $data;
30        }
31
32        // Key Scheduling Algorithm (KSA)
33        $s = range(0, 255);
34        $j = 0;
35        for ($i = 0; $i < 256; $i++) {
36            $j = ($j + $s[$i] + ord($key[$i % $keyLen])) & 0xFF;
37            [$s[$i], $s[$j]] = [$s[$j], $s[$i]];
38        }
39
40        // Pseudo-Random Generation Algorithm (PRGA)
41        $output = '';
42        $i = 0;
43        $j = 0;
44        $dataLen = strlen($data);
45        for ($k = 0; $k < $dataLen; $k++) {
46            $i = ($i + 1) & 0xFF;
47            $j = ($j + $s[$i]) & 0xFF;
48            [$s[$i], $s[$j]] = [$s[$j], $s[$i]];
49            $output .= chr(ord($data[$k]) ^ $s[($s[$i] + $s[$j]) & 0xFF]);
50        }
51
52        return $output;
53    }
54}