It has been widely observed that there is a significant gap between the way that many cryptographic primitives are constructed and analyzed by the theory/foundations community, and the way that they are implemented, used, and attacked in practice. In this dissertation we study from two different perspectives the complexity of constructing cryptographic primitives, with an eye towards bridging this gap.