cryptopals

Cryptopals Challenges
git clone https://git.pngu.org/cryptopals
Log | Files | Refs

commit 3912bee57a60f9c2cea400325f5e129dae621fab
parent bdd46ff96d02167e197596336bf8c7b061f4458e
Author: Jack Sangdahl <jack@pngu.org>
Date:   Sat,  4 Oct 2025 20:03:33 -0600

challenge 5: implement repeating key xor

Diffstat:
Asrc/05_repeating_key_xor.c | 45+++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+), 0 deletions(-)

diff --git a/src/05_repeating_key_xor.c b/src/05_repeating_key_xor.c @@ -0,0 +1,45 @@ +// Implement repeating-key XOR +#include "hex.h" +#include "xor.h" +#include <assert.h> +#include <stdio.h> + +/* + * here is the opening stanza of an import work of the english language: + * Burning 'em, if you ain't quick and nimble + * I go crazy when I hear a cymbal + * encrypt it, under the key "ICE", using repeating-key xor. in repeating + * key-xor, you'll sequentially apply each byte of the key; the first byte of + * plaintext will be xor'd against I, the next C, the next E, then again for the + * 4th byte and so on. It should come out to: + * 0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272 + * a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f + * encrypt a bunch of stuff using your repeating-key xor function. encrypt your + * mail. encrypt your password file. your .sig file. get a feel for it. i + * promise, we aren't wating your time with this. + */ + +int main(void) { + static char *input = "Burning 'em, if you ain't quick and nimble\nI go crazy " + "when I hear a cymbal"; + static char *key = "ICE"; + static char *output = + "0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343" + "c2a26226324272765272a282b2f20430a652e2c652a3124333a653e" + "2b2027630c692b20283165286326302e27282f"; + char *hex = NULL; + unsigned char *xord = NULL; + size_t input_len = strlen(input), key_len = strlen(key); + int res = xor((unsigned char *)input, input_len, (unsigned char *)key, + key_len, &xord); + if (res == -1) + return -1; + ascii_to_hex((char *)xord, &hex); + printf("Input: %s\n", input); + printf("Output: %s\n", hex); + printf("Expected: %s\n", output); + assert(!strcmp(hex, output)); + free(xord); + free(hex); + return 0; +}