A computer implemented method of tokenizing data, the method comprising: a) accessing input data to be tokenized, the input data comprising a first portion and a second portion; b) generating an initialization vector based on the first input data portion and a first set of token tables by selecting a first token table from the first set of token tables at random and querying the selected first token table with a value of the first input data portion to obtain the initialization vector, the first token table mapping each of a plurality of input values to a different token value, the initialization vector comprising the token value mapped to the value of the first input data portion; c) tokenizing the second input data portion based on the initialization vector and a second set of token tables; d) concatenating the first input data portion and the tokenized second input data portion to generate a tokenized data output; and e) storing the tokenized data output in a non-transitory computer readable storage medium, f) wherein tokenizing the second input data portion comprises: f-1) modifying the second input data portion based on the initialization vector to produce a modified second input data portion; f-2) selecting a second token table from the second set of token tables at random; and f-3) querying the selected second token table from the second set of token tables with a value of the modified second input data portion to produce a tokenized second input data portion, the second token table mapping each of a plurality of input values to a different token value, the tokenized second input data portion comprising the token value mapped to the value of the modified second input data portion. a) accessing input data to be tokenized, the input data comprising a first portion and a second portion; b) generating an initialization vector based on the first input data portion and a first set of token tables by selecting a first token table from the first set of token tables at random and querying the selected first token table with a value of the first input data portion to obtain the initialization vector, the first token table mapping each of a plurality of input values to a different token value, the initialization vector comprising the token value mapped to the value of the first input data portion; c) tokenizing the second input data portion based on the initialization vector and a second set of token tables; d) concatenating the first input data portion and the tokenized second input data portion to generate a tokenized data output; and e) storing the tokenized data output in a non-transitory computer readable storage medium, f) wherein tokenizing the second input data portion comprises: f-1) modifying the second input data portion based on the initialization vector to produce a modified second input data portion; f-2) selecting a second token table from the second set of token tables at random; and f-3) querying the selected second token table from the second set of token tables with a value of the modified second input data portion to produce a tokenized second input data portion, the second token table mapping each of a plurality of input values to a different token value, the tokenized second input data portion comprising the token value mapped to the value of the modified second input data portion. f-1) modifying the second input data portion based on the initialization vector to produce a modified second input data portion; f-2) selecting a second token table from the second set of token tables at random; and f-3) querying the selected second token table from the second set of token tables with a value of the modified second input data portion to produce a tokenized second input data portion, the second token table mapping each of a plurality of input values to a different token value, the tokenized second input data portion comprising the token value mapped to the value of the modified second input data portion.