Digital data transmitted over channels with impairments such as noise, distortions, and fading is inevitably delivered to the user with some errors. A similar situation occurs when digital data is stored on devices such as magnetic or other media that contain imperfections. The rate at which errors occur is a very important design criterion for digital communication links and for data storage. Usually, it must be kept smaller than a given preassigned value, which depends on the application. Error correction techniques based on the addition of redundancy to the original message can be used to control the error rate. The most obvious, albeit not efficient, example is the repetition of the same message. In this chapter we illustrate several efficient error correction techniques.