A method of generating a private cryptographic key for use in a secure cryptogram for transmission between a first entity and a second entity, the method comprising: generating an n -dimensional vector space shared between the first entity and the second entity prior to selecting a random vector in the n -dimensional vector space, comprising the steps of: generating a random binary string; dividing the random binary string into a plurality of discrete sub-sections, each sub-section comprising a plurality of bits; associating an index to each sub-section; projecting the binary string into the n -dimensional vector space using a projection function, the projection function mapping the indices associated with at least some of the subsections, to different coordinate values in the n -dimensional vector space; selecting the random vector defined in the n -dimensional vector space shared between the first entity and the second entity, comprising generating a random sequence of indices and selecting the random vector by identifying the coordinate value associated with each index in the sequence of randomly generated indices, each coordinate value being associated with a plurality of bits; determining the plurality of bits associated with each coordinate value comprised in the random vector, by identifying the index associated with each coordinate value, and determining the plurality of bits associated with each coordinate value in dependence on the identified index; and generating the private key in dependence on the plurality of bits associated with each coordinate value comprised in the random vector. generating an n -dimensional vector space shared between the first entity and the second entity prior to selecting a random vector in the n -dimensional vector space, comprising the steps of: generating a random binary string; dividing the random binary string into a plurality of discrete sub-sections, each sub-section comprising a plurality of bits; associating an index to each sub-section; projecting the binary string into the n -dimensional vector space using a projection function, the projection function mapping the indices associated with at least some of the subsections, to different coordinate values in the n -dimensional vector space; generating a random binary string; dividing the random binary string into a plurality of discrete sub-sections, each sub-section comprising a plurality of bits; associating an index to each sub-section; projecting the binary string into the n -dimensional vector space using a projection function, the projection function mapping the indices associated with at least some of the subsections, to different coordinate values in the n -dimensional vector space; selecting the random vector defined in the n -dimensional vector space shared between the first entity and the second entity, comprising generating a random sequence of indices and selecting the random vector by identifying the coordinate value associated with each index in the sequence of randomly generated indices, each coordinate value being associated with a plurality of bits; determining the plurality of bits associated with each coordinate value comprised in the random vector, by identifying the index associated with each coordinate value, and determining the plurality of bits associated with each coordinate value in dependence on the identified index; and generating the private key in dependence on the plurality of bits associated with each coordinate value comprised in the random vector.