A cryptography method comprising: obtaining, by operation of one or more processors, a solution to a puzzle, wherein the solution to the puzzle is obtained by performing an iterative process that includes two or more iterations, wherein each iteration comprises a generating step, a seeding step and an obtaining step, wherein the generating step comprises generating a puzzle solution for the iteration by applying a puzzle function to a puzzle input for the iteration, wherein generating the puzzle solution has a higher computational cost than verifying the puzzle solution, the puzzle input comprises an output product of a compact de-sparser function and applying the puzzle function to the puzzle input for the iteration comprises seeding the puzzle function with the output product of the compact de-sparser function for the iteration, wherein the compact de-sparser function comprises a pseudorandom function that takes one input, wherein a compact source code defines a seed information and the compact de-sparser function in a computer programming language, and the compact source code is incompressible; wherein the seeding step comprises seeding a pseudorandom generator based on the puzzle solution for the iteration, wherein the pseudorandom generator comprises the compact de-sparser function; and wherein the obtaining step comprises, after seeding the pseudorandom generator, obtaining an output from the pseudorandom generator for the iteration; wherein a puzzle input for at least one iteration is based on an output from the pseudorandom generator for a prior iteration of the iterative process; and generating a parameter for a cryptographic function by operation of one or more data processors, the parameter being generated from an output from the pseudorandom generator for a last iteration of the iterative process. obtaining, by operation of one or more processors, a solution to a puzzle, wherein the solution to the puzzle is obtained by performing an iterative process that includes two or more iterations, wherein each iteration comprises a generating step, a seeding step and an obtaining step, wherein the generating step comprises generating a puzzle solution for the iteration by applying a puzzle function to a puzzle input for the iteration, wherein generating the puzzle solution has a higher computational cost than verifying the puzzle solution, the puzzle input comprises an output product of a compact de-sparser function and applying the puzzle function to the puzzle input for the iteration comprises seeding the puzzle function with the output product of the compact de-sparser function for the iteration, wherein the compact de-sparser function comprises a pseudorandom function that takes one input, wherein a compact source code defines a seed information and the compact de-sparser function in a computer programming language, and the compact source code is incompressible; wherein the seeding step comprises seeding a pseudorandom generator based on the puzzle solution for the iteration, wherein the pseudorandom generator comprises the compact de-sparser function; and wherein the obtaining step comprises, after seeding the pseudorandom generator, obtaining an output from the pseudorandom generator for the iteration; wherein a puzzle input for at least one iteration is based on an output from the pseudorandom generator for a prior iteration of the iterative process; and generating a parameter for a cryptographic function by operation of one or more data processors, the parameter being generated from an output from the pseudorandom generator for a last iteration of the iterative process.