A method of encoding data into a code having systematic output symbols and non-systematic output symbols, the method comprising: generating, from the data, a set of k input symbols; outputting the set of k input symbols as the systematic output symbols; selecting systematic keys for the set of k input symbols, said systematic keys being selected from L pre-generated systematic unique keys, wherein L is a function of the number of input symbols, k, and wherein said L keys have been computed with a systematic key generator using random numbers generated by a random number generator; generating, from the set of k input symbols and corresponding systematic keys, a plurality of k intermediate input symbols in a chain reaction decoding process; generating with a non-systematic key generator non-systematic keys for the plurality of intermediate input symbols using random numbers generated by said random number generator; chain reaction encoding the plurality of intermediate input symbols into one or more non-systematic output symbols using the non-systematic keys, wherein one or more intermediate input symbols are encoded into one non-systematic output symbol, wherein each of the one or more non-systematic output symbols is selected from an alphabet of non-systematic output symbols, and wherein, for each non-systematic key, a non-systematic output symbol is generated as a function of one or more of the plurality of intermediate input symbols and the non-systematic key, and wherein any subset of the set of input symbols that will not be acquired by a receiver of the code is recoverable from (i) a predetermined number of non-systematic output symbols that will be acquired, or (ii) a combination of (a) input symbols that will be acquired and (b) one or more of the non-systematic output symbols that will be acquired. generating, from the data, a set of k input symbols; outputting the set of k input symbols as the systematic output symbols; selecting systematic keys for the set of k input symbols, said systematic keys being selected from L pre-generated systematic unique keys, wherein L is a function of the number of input symbols, k, and wherein said L keys have been computed with a systematic key generator using random numbers generated by a random number generator; generating, from the set of k input symbols and corresponding systematic keys, a plurality of k intermediate input symbols in a chain reaction decoding process; generating with a non-systematic key generator non-systematic keys for the plurality of intermediate input symbols using random numbers generated by said random number generator; chain reaction encoding the plurality of intermediate input symbols into one or more non-systematic output symbols using the non-systematic keys, wherein one or more intermediate input symbols are encoded into one non-systematic output symbol, wherein each of the one or more non-systematic output symbols is selected from an alphabet of non-systematic output symbols, and wherein, for each non-systematic key, a non-systematic output symbol is generated as a function of one or more of the plurality of intermediate input symbols and the non-systematic key, and wherein any subset of the set of input symbols that will not be acquired by a receiver of the code is recoverable from (i) a predetermined number of non-systematic output symbols that will be acquired, or (ii) a combination of (a) input symbols that will be acquired and (b) one or more of the non-systematic output symbols that will be acquired.