A method of verifying that a user code entered into a computing system matches a true code, the method comprising: defining a set of code characters that can be used in a product identity code; defining one or more subsets of the set of code characters, each of the subsets comprising two or more predefined identification equivalents of the set of code characters, each subset having a predetermined subset identifier; defining a transformation for generating an identity of a true code or user entered code based on the predetermined subset identifier of each subset; receiving a user entered code, comprising receiving a set of one or more code characters entered by a user for the purpose of verifying a product; generating an identity of the true code; comparing the user entered code and the true code and determining the number of errors or types of errors detected between the user entered code and the true code; wherein each error has an associated probability score and correction of the one or more errors detected in the user entered code is completed based upon the probability score associated with the one or more errors detected and only correcting the user entered code if the probability score of the correction is above a pre-defined threshold; wherein the probability score is calculated or predefined for a substitution of characters including, for certain characters, a first content probability score for physical proximity and a second content probability score for character similarity wherein the first content probability score and the second content probability score are non-linearly combined; deciphering the user entered code by application of the transformation to obtain an identity of the user entered code; and verifying that the identity of the user entered code matches the identity of the true code. defining a set of code characters that can be used in a product identity code; defining one or more subsets of the set of code characters, each of the subsets comprising two or more predefined identification equivalents of the set of code characters, each subset having a predetermined subset identifier; defining a transformation for generating an identity of a true code or user entered code based on the predetermined subset identifier of each subset; receiving a user entered code, comprising receiving a set of one or more code characters entered by a user for the purpose of verifying a product; generating an identity of the true code; comparing the user entered code and the true code and determining the number of errors or types of errors detected between the user entered code and the true code; wherein each error has an associated probability score and correction of the one or more errors detected in the user entered code is completed based upon the probability score associated with the one or more errors detected and only correcting the user entered code if the probability score of the correction is above a pre-defined threshold; wherein the probability score is calculated or predefined for a substitution of characters including, for certain characters, a first content probability score for physical proximity and a second content probability score for character similarity wherein the first content probability score and the second content probability score are non-linearly combined; deciphering the user entered code by application of the transformation to obtain an identity of the user entered code; and verifying that the identity of the user entered code matches the identity of the true code.