Algebraic Geometry and its applications to error correcting codes and cryptography