Is there a difference between 復習 and 複習?
Short answer: The correct form is 複習. The following details the history regarding the two characters to explain why.

While 複 and 復 are pronounced exactly the same in modern Mandarin Chinese with the exact same tones (fù) and are both written as 复 in Simplified Chinese, they originally had different pronunciations.

複 was pronounced with an unvoiced initial consonant in Middle Chinese (ca. 600), /pjuk/, while
復 had a voiced initial consonant, /bjuk/. Because both words ended with the final consonant /k/, they belonged to a class of words having a checked tone (入聲) in Middle Chinese.

A few pronunciation shifts happened during the transition to Late Middle Chinese (ca. 1000):


Bilabial consonants /p/ and /b/ followed by the glide consonant /j/ became labiodental fricatives /f/ and /v/.
A distinction in voicing of initial consonants lead to a phonemic split in Middle Chinese tone categories. Each tone category was split into "upper" 陰 and "lower" 陽 registers, with words having unvoiced initials in the former and those with voiced initials in the latter.
Later on, the voicing distinction ends up disappearing†, resulting in /f/ and /v/ merging into /f/, but the aforementioned tonal distinction remained.


By the end of Late Middle Chinese, this resulted in 複 having a pronunciation of /fuk/ with a 陰入 tone and 復 having a pronunciation of /fuk/ with a 陽入 tone. In fact, because modern Cantonese retains all the tones of Late Middle Chinese, it maintains this same distinction between these two words; compare 複 fuk1 vs. 復 fuk6.

The transition from Late Middle Chinese to modern Mandarin underwent a few more sound changes, the most significant of which was the loss of the final consonants that denoted checked tone words (such as the final /k/). Because of this, the checked tone as a category was completely lost, and many of its words ended up being redistributed into the other tones in an unpredictable manner. In modern Mandarin, both of these characters ended up with the Mandarin fourth tone, resulting in their modern pronunciation, fù.

The correct word should be 複習, and its evidenced by the way the word is pronounced in Cantonese, fuk1 zaap6. In fact if you instead say fuk6 zaap6 in Cantonese, you'd actually be referring to a different word, 復雜.

As for why their meanings are so similar, the ABC Etymological Dictionary of Old Chinese actually lists them under the same etymon. Old Chinese used to be more derivational, with affixes resulting in slight differences in meaning. In this case 複 is reconstructed with an Old Chinese pronunciation of *pruk while 復 is reconstructed with the *m- prefix: *mpruk. This prefix is believed to have originally indicated a causative or volitional meaning (複 'repeat' vs. 復 'cause to repeat', see Old Chinese: A New Reconstruction, pp. 54-5).

Although this process is no longer productive in modern Chinese, it often surfaces in pairs of words that have similar meanings but different tones or initial consonants. This previous Chinese StackExchange answer gives another example. In many cases, many of these words may have merged back together and ended up with the same pronunciation as is the case with 複 and 復 in modern Mandarin.

To summarize:


複 OC *pruk > EMC pjuk > LMC fuk > Mand. fù
復 OC *mpruk (*m- + 複) > EMC bjuk > LMC vuk > Mand. fù


If you're interested in reading more about how modern Chinese pronunciations developed, take a look at the Historical Chinese Phonology Wikipedia page.

† As an aside, the voicing distinction actually remains in the modern Wu varieties of Chinese (of which Shanghainese is one). I'm not very familiar with Wu Chinese, but I believe the pronunciation of 複 and 復 ends up being something like /foʔ/ and /voʔ/, respectively, in many of those dialects.