A method of decoding data at a receiver, wherein the received data to be decoded is received from a transmitter as a set of output symbols comprising all or some of K systematic output symbols having corresponding systematic keys and corresponding to K input symbols, the systematic keys have been generated at the transmitter using random numbers of a random number generator, all or some of a plurality of non-systematic output symbols, wherein each non-systematic output symbol was generated in a chain reaction encoding process at said transmitter as a function of one or more of a plurality of intermediate input symbols using a corresponding non-systematic key, said plurality of intermediate input symbols having been generated at said transmitter from the K input symbols and from the corresponding systematic keys in a chain reaction decoding process, the non-systematic keys have been generated at said transmitter using random numbers of said random number generator, wherein K is an integer greater than one and the chain reaction encoding process may generate a potentially limitless number of non-systematic output symbols from the K intermediate input symbols, wherein each of the K input symbols is representable by a value that is from an input symbol alphabet, and wherein each of the received output symbols has a value that is from an output symbol alphabet, the method comprising: determining a key for each of the received output symbols to be used in decoding; if an output symbol's key is one of the systematic keys, storing that output symbol's value as the value for at least one of the K input symbols corresponding to the systematic key, thereby recovering at least one input symbol; determining if any of the K input symbols are not yet recovered; and if any unrecovered input symbols remain, performing the steps of: a) determining at least one of the non-systematic keys for received non-systematic output symbols; b) determining (i) a mapping between one or more intermediate input symbols and the output symbols based on the systematic and non-systematic keys and (ii) a mapping between the one or more intermediate input symbols and the unrecovered input symbols based on the systematic keys; c) identifying if any intermediate input symbols can be recovered from the available output symbols; d) recovering intermediate input symbols that can be recovered in a chain reaction decoding process, and recovering input symbols from the recovered intermediate input symbols in a chain reaction encoding process; and e) repeating steps c) and d), until a threshold number of the K input symbols are recovered. determining a key for each of the received output symbols to be used in decoding; if an output symbol's key is one of the systematic keys, storing that output symbol's value as the value for at least one of the K input symbols corresponding to the systematic key, thereby recovering at least one input symbol; determining if any of the K input symbols are not yet recovered; and if any unrecovered input symbols remain, performing the steps of: a) determining at least one of the non-systematic keys for received non-systematic output symbols; b) determining (i) a mapping between one or more intermediate input symbols and the output symbols based on the systematic and non-systematic keys and (ii) a mapping between the one or more intermediate input symbols and the unrecovered input symbols based on the systematic keys; c) identifying if any intermediate input symbols can be recovered from the available output symbols; d) recovering intermediate input symbols that can be recovered in a chain reaction decoding process, and recovering input symbols from the recovered intermediate input symbols in a chain reaction encoding process; and e) repeating steps c) and d), until a threshold number of the K input symbols are recovered. a) determining at least one of the non-systematic keys for received non-systematic output symbols; b) determining (i) a mapping between one or more intermediate input symbols and the output symbols based on the systematic and non-systematic keys and (ii) a mapping between the one or more intermediate input symbols and the unrecovered input symbols based on the systematic keys; c) identifying if any intermediate input symbols can be recovered from the available output symbols; d) recovering intermediate input symbols that can be recovered in a chain reaction decoding process, and recovering input symbols from the recovered intermediate input symbols in a chain reaction encoding process; and e) repeating steps c) and d), until a threshold number of the K input symbols are recovered.