Understanding that there will always be some students who would rather cheat on their assessments than complete them with integrity, a number of authors have proposed rules of thumb for writing assignments that will reduce the incidence of cheating. Unfortunately, these rules are so general as to be of little help when it comes to actually designing an assignment, and then varying it from one course offering to the next. This paper uses a case study, a programming assignment in cryptography, to propose specific guidelines that can be applied to the design of programming assignments to reduce the chance that students will be able to copy from students in prior offerings of the course, and to reduce the chance that students will be able to copy from programs found on the web. The guidelines illustrated by the case study are to begin with something basic, to add hidden complexity, to add manifest complexity, to add levels of complexity, to vary the assignment substantially in each successive offering, and to have multiple test plans.