just for fun:
caeser[s_, k_] := StringReplace[s, rules[k]];
rules[k_] := Flatten[rulepairs[#, RotateLeft[#, k]] & /@ characters];
rulepairs[u_, v_] := Rule[#[[1]], #[[2]]] & /@ Partition[Riffle[u, v], 2];
characters := {CharacterRange["A", "Z"], CharacterRange["a", "z"]};
caeser[s, 3]
caeser[s, -3]