Programming with Cryptographic Libraries Exercises
|
|
Exercises.
From the previous sections, you have learned to write a cryptographic
program using the OpenSSL library, and how to compile your
program. In this section, you will be presented with a series
of exercises requiring you to write programs using the knowledge you
have learned from previous sections. You need to solve each problem
using both Java and C.
If you are submitting your work include your name in the header
of each program. You also need to include a printout of your
program's result as seen on the screen. Use the "script" program on Unix to capture your
screen typing. Zip all source code into a single folder where your
file name is lab1-<your name>.zip.
It is not necessary to submit the Worksheet
Solutions document as long as you include a printout of the
following answers.
Problem 1. Given a Base64 encoded ciphertext, key and IV that has been
encrypted using AES in CBC mode, find the plaintext.
- Based64-encoded ciphertext:
hTpVHO39rnpFyThzbcI+gg0rdBcbHL+5OqWFFY8QDF6T/nX4+O1lXFgJnDbRFaC1lL5hFY3uVsbQ8mP14yeSD
NnD2dFnhBZLbkjqriE8IwJfcA3yL1Q3LhKQVUWPgPrZVvL98RtKl9ZEYCW/Sb7egw==
- Key: Have you failed?
- IV: This is your IV!
Hints:
- The encoded ciphertext, the key, and the IV are string-type
- Ciphertext should be on one line or one string to avoid the newline character (\n) in the string.
- For encoding in OpenSSL, use EVP_EncodeBlock and EVP_DecodeBlock
for Base64 encoding and decoding, respectively. Here are function
headers and how to use them. Find more details in openssl/crypto/evp/encode.c
file
- int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int
dlen)
- elen = EVP_EncodeBlock(encoded, ciphertext, clen);
- This function encodes a ciphertext string into encoded string, and
encodes it for clen bytes, which is the total length of the
ciphertext string. This function returns the amount of encoded
string in bytes.
int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int
n);
- dlen = EVP_DecodeBlock(decoded, encoded, elen); \
- In contrast, this function decodes the encoded string for elen bytes
to decoded string, and returns the amount of decoded string in
bytes.
You key and IV must be 16 bytes long, which is used for AES cipher.
Problem 2. Given a partial secret key (the first 13 bytes) and
the IV, try
breaking an AES encryption in CBC mode by searching for the last 3
bytes of the key to find the associated plaintext.
- Partial key (the first 13 bytes):
{0x01,0x23,0x45,0x67,0x89,0x1a,0xbc,0xde,0xf0,0x01,0x23,0x45,0x67}
- IV:
{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,0x00}
- Known beginning text: "The unknown message is:"
- Base64-encoded ciphertext:
A8K+2+60yXYmEBQHOW4BN/2f/ubS5JMHy/B4hpGiaHDbR4qGLBL0AiwvUKi/th+lHt2meNQ82Zmfmnk2+rqd6
dBERgBe82v7Smvri2T3VNuhu00h42l6CWHfPguguX5Ya1MNvmBxvMWygk21q+t0nA==
Hints:
- The partial key and the IV are in hexadecimal form, but the ciphertext are encoded using Base64
- Ciphertext should be on one line or one string to avoid the
newline character (\n) in the string.
- You need to append three bytes at the end of the given partial
key, and change them to find the right key.
- You will need to search within 224 output spaces and find the
meaningful output, which is the original plaintext.
- The plaintext has known beginning. Thus, you will know you find
the right key when the beginning of decrypted plaintext matches the known beginning.
- You can reuse your previous program to crack this problem.
- It may be easier if you start your program to search from smaller
space size such as 256 (28) key spaces, and assume the second last
byte. After you are confident in your program, you can increase the
key search space to one or more bytes.
Problem 3. Implement AES encryption using the Counter Mode Encryption (CTR) or AES-CTR,
and use your own key, IV, and
message. Submit your key, IV, plaintext, and the Base64 encoded ciphertext for grading.
Do not forget to encode your ciphertext using
Base64 encoding so it can be readable for grading.
Problem 4. Use the AES-CTR mode to decrypt the given ciphertext using a given
key and IV. Find and submit the associated plaintext.
You will use a CTR cipher, a stream mode cipher, to encrypt a counter to
produce a stream of pseudorandom numbers that
are used to encrypt plaintext, which is simply an XOR encryption
operation.
- Key: What do you see?
- IV: Who would ya be?
- Ciphertext: (Encoded by Base64):
dIR1uyU0YhU9s3+jLwgzLhXQbbt2I2IeMqlo9jAZL35cyiW7ICJ5AXSve/MzHyIqW81xp21nahZ0r3v3NQA/K0GEdrszNCsMP
KUr7CwdOStB0Wu3Ij4rETrgbvU5Hy96Uc1juD8kfhQguSWjcU0FMkeEUrc4NH8XOuBI6ykfNTxcyGn+fnYzT2DtOrpqWH8=
- You MUST use AES in CFB mode to encrypt the
counter, which starts from zero.
- Ciphertext should be on one line or one string to avoid the
newline character (\n) in the string.
- Here is the pseudocode for the CTR program.
1 encrypted_counter = AES_Encrypt(counter);
2 for (the number of plaintext bytes)
3 if (we don't have enough encrypted counter bytes) {
4 increase the counter;
5 encrypt the counter;
6 }
7 ciphertext = pseudorandom plaintext;
- On line 1, the first block of random bytes
are generated by encrypting a counter number. Using AES
you will have 16 random bytes from one encryption. This
means you will need 6 AES encryptions for plaintext with a
length between 81 - 96 bytes. Lines 3 -6 will check
whether there are enough encrypted bytes for a XOR operation.
If not the counter should be increased. Line 7 a XOR
operation is performed on the plaintext using the random
bytes.
- CTR's decryption mode is similar to the
process of encrypting the counter in the previous step.
To find the associated plaintext use XOR operations on the
ciphertext using the random bytes generated by the counter. For more information about
the CTR mode visit
http://csrc.nist.gov/CryptoToolkit/modes/workshop1/papers/lipmaa-ctr.pdf.
Hints:
- Define a counter as a 16-byte string for simplicity.
- To encrypt a block of 16 bytes of the counter using AES in CFB
mode.
- For each 16 bytes of plaintext, you need to do the counter
encryption, and need to increase the counter by one to encrypt other
16 bytes for next encryption
- Make sure your counter start from zero.
Worksheet Solutions. The following questions you are
required to submit.
Problem 1. Plaintext
____________________________________________________________________
Problem 2. The last three bytes of the key are
______________________________________________
Plaintext
____________________________________________________________________
Problem 3: Message ____________________________________________________________________
Key
________________________________________________________________________
IV __________________________________________________________________________
Ciphertext
___________________________________________________________________
Problem 4: The plaintext is
_______________________________________________________________
|