TheAlgorithms/Java · error · IllegalArgumentException
Key length must match input length
Error message
Key length must match input length
What it means
Thrown by OneTimePadCipher.validateInputs when input.length != key.length. A one-time pad XORs each plaintext/ciphertext byte with a corresponding key byte, so the key must be exactly the same length as the data. Applies to both encrypt and decrypt, which both route through validateInputs.
Source
Thrown at src/main/java/com/thealgorithms/ciphers/OneTimePadCipher.java:78
* <p>For a One-Time Pad, decryption is identical to encryption:
* {@code plaintext = ciphertext XOR key}.
*
* @param ciphertext the ciphertext bytes, must not be {@code null}
* @param key the one-time pad key bytes, must not be {@code null}
* @return the decrypted plaintext bytes
* @throws IllegalArgumentException if the key length does not match ciphertext length
* @throws NullPointerException if ciphertext or key is {@code null}
*/
public static byte[] decrypt(byte[] ciphertext, byte[] key) {
validateInputs(ciphertext, key);
return xor(ciphertext, key);
}
private static void validateInputs(byte[] input, byte[] key) {
Objects.requireNonNull(input, "input must not be null");
Objects.requireNonNull(key, "key must not be null");
if (input.length != key.length) {
throw new IllegalArgumentException("Key length must match input length");
}
}
private static byte[] xor(byte[] data, byte[] key) {
byte[] result = new byte[data.length];
for (int i = 0; i < data.length; i++) {
result[i] = (byte) (data[i] ^ key[i]);
}
return result;
}
}
View on GitHub (pinned to fdfb9a395b)
Solutions
- Generate the key with exactly the plaintext length: generateKey(plaintext.length).
- Pre-check key.length == data.length before encrypt/decrypt.
- Do not reuse or truncate one-time-pad keys; regenerate per message.
Example fix
// before byte[] key = OneTimePadCipher.generateKey(16); byte[] ct = OneTimePadCipher.encrypt(plaintext, key); // fails if plaintext.length != 16 // after byte[] key = OneTimePadCipher.generateKey(plaintext.length); byte[] ct = OneTimePadCipher.encrypt(plaintext, key);
Defensive patterns
Strategy: validation
Validate before calling
if (key.length != data.length) {
throw new IllegalArgumentException("key length (" + key.length + ") must equal data length (" + data.length + ")");
}
byte[] out = OneTimePadCipher.encrypt(data, key); Type guard
static boolean lengthsMatch(byte[] data, byte[] key) {
return data != null && key != null && data.length == key.length;
} Try / catch
try {
byte[] ct = OneTimePadCipher.encrypt(data, key);
} catch (IllegalArgumentException e) {
// length mismatch; regenerate key at the right length
byte[] k = OneTimePadCipher.generateKey(data.length);
ct = OneTimePadCipher.encrypt(data, k);
} Prevention
- Generate the key at plaintext length: generateKey(plaintext.length).
- Never reuse or truncate one-time-pad keys.
- Pre-check length equality before encrypt/decrypt.
When it happens
Trigger: Calling encrypt or decrypt with a key whose byte length differs from the data byte length. Also note null inputs throw NullPointerException (via Objects.requireNonNull) before this check.
Common situations: Reusing or truncating a key; deriving key length from a different source than the message; generating a key for the wrong message size; multi-block messages with a single-block key.
Related errors
- length must be non-negative
- Invalid Baconian code: {}
- DES key must be supplied as a 64 character binary string
- Encrypted message should be a multiple of 64 characters in l
- Base, secret, and prime must be non-null and positive values
AI-assisted analysis of TheAlgorithms/Java@fdfb9a395b (2026-08-13).
Data as JSON: /api/errors/321d686ab8132573.
Report an issue: GitHub.