
Encryptor is Allen Analytical's premier product.
Encryptor is a password generator and manager for Max OS X v10.6.6 or later.
Encryptor is designed to solve three common problems with passwords: variability in the combination of upper and lower case characters, decimal digits, and special characters allowed by the authenticator, variability in complexity requirements established by the authenticator, and uniqueness.
Encryptor uses memorable words and phrases to generate conforming passwords or other authentication tokens which are indistinguishable from random text using pencil-and-paper methods.
Encryptor is designed to solve the following problem:
Web service providers have a need to authenticate users. This requires the web service provider to establish login credentials for authorized users, most commonly using an account name and password. The need to authenticate requires web service providers to establish reasonable and prudent password policies for their own and their users' security and continuity of service.
Each web service provider may have a unique password format with which users must comply by selecting a password which meets certain minimum requirements, referred to herein as a "conforming password", e.g., to prevent dictionary-based "brute force" attempts to gain unauthorized access. Some web service providers require conforming passwords to contain both upper and lower case characters, some require the use of decimal digits, and some require the use of special characters. Or, web service providers may not require, but rather allow, the use of both upper and lower case characters, decimal digits, and special characters. In addition, the allowed special characters may vary from web service provider to web service provider.
Compounding the problem, web service providers periodically require their users to change their passwords to another conforming password and users have only a short time to select a password they can remember because they may not know that they are required to change their password until they log in and discover their password has expired, or are informed by a website that there has been a security incident and that a password change is required.
Password format requirements variously cause users to select weak, but memorable, passwords or strong, but difficult to remember, passwords which they then write down, and require web service providers to make provisions for users forgetting their passwords.
The use of "passphrases" is often advanced as a possible solution to this problem, however, passphrases are an inelegant solution, and their demand on the user differs little from that required by a strong password. The user may have to remember, for example, the passphrase, which letters have been converted to numbers, which letters have been capitalized, and which letters have been converted to special characters, or where special characters have been inserted. In addition, the use of passphrases does not allow a user to quickly or easily generate conforming passwords.
Encryptor uses memorable words and phrases to generate conforming passwords or other authentication tokens which are indistinguishable from random text, based on the combination of upper and lower case characters, decimal digits, and special characters established by the web service provider. Users may record these memorable words and phrases, or, alternately, record the page and paragraph number of a favorite book, phone book, or any other source of text which is common, relatively accessible, and easy to index.
The use of a personal encryption algorithm ensures that not even access to the memorable words and phrases is adequate to reconstruct the password. For example, users may leverage the ability of Encryptor to extract valid special characters from a memorable word or phrase to allow combinations of user name and URL to be used to generate a conforming password, or users may double-up, reverse, or otherwise obfuscate the key used to encrypt the plaintext.
It should be noted that the purpose of Encryptor is not to generate a random password. The purpose of Encryptor is to allow users to combine something they have, i.e., a document recording their choices, with what they know, i.e., their personal encryption algorithm, to generate a conforming password which is indistinguishable from random text.
I wrote Encryptor because I couldn't buy it.
Encryptor records the plaintext alphabet characteristics established by the web service provider and which are therefore outside your control (see Encryptor - About - Password requirements established by the web service provider).
The primary purpose for recording the plaintext alphabet characteristics established by the web service provider is to quickly and easily generate a conforming password using the combination of upper and lower case characters, decimal digits, and special characters allowed by the web service provider (or allowed character set, see Encryptor - Support - Glossary). Using the allowed character set ensures the potential search space is as large as possible. This is one of the advantages Encryptor provides you.
Recording the plaintext alphabet characteristics established by the web service provider is also a convenience to the user when changing passwords or generating multiple conforming passwords for the same domain. For example, how many times have you attempted to log in to your bank, credit union, or other web service provider only to be confronted by a page informing you that "Your password has expired", requiring you to change your password to another conforming password before allowing you to continue?
Encryptor makes it easy to generate another conforming password. You can either modify the original encryptor or create a new encryptor by copying and pasting an existing encryptor into the same document (recommended). By creating a new encryptor you preserve your previous password until you receive confirmation that your password change has been accepted. Then, based on your personal encryption algorithm, select parsable tokens which result in another conforming password. Retain the previous password or delete it, depending on your preference.
Encryptor records the complexity requirements established by the web service provider and which are therefore outside your control (see Encryptor - About - Password requirements established by the web service provider).
The primary purpose for recording the complexity requirements established by the web service provider is to quickly and easily generate a conforming password which satisfies the complexity requirements established by the web service provider (see Encryptor - Support - Glossary). This is one of the advantages Encryptor provides you.
Recording the complexity requirements established by the web service provider is also a convenience to the user when changing passwords or generating multiple conforming passwords for the same domain.
The purpose of Encryptor is to allow users to combine something they have, i.e., a document recording their choices, with something they know, i.e., their personal encryption algorithm, and create a unique password for each web service provider.
Encryptor records the details of password generation which are outside your control as a convenience to you and uses parsable tokens which you specify to encipher plaintext. This is something you have.
Encryptor supports the development and use of a personal encryption algorithm known only to you. Your personal encryption algorithm is the method by which the details of password generation which are outside your control and parsable tokens you specify are combined to generate a conforming password. This is something you know.
Encryptor therefore makes it possible to use a unique password for each site you visit1.
By design, as the user you retain control of your data. Encryptor saves your data locally, and exports to standards-compliant XML for portability, backup, and retention. There is no "vault" providing a potential attacker with the opportunity to recover all of your passwords from a remote server the security of which is outside of your control. You do not need an account to use Encryptor. Continued access to your data does not require, nor will it ever require, recurring payment such as a subscription. There is not now, nor will there ever be, an annual fee.
This is consistent with Allen's commitment to data portability (see Allen Analytical - About - Allen Analytical's commitment to data portability).
Encryptor records the plaintext alphabet characteristics established by the web service provider and which are therefore outside your control (see Encryptor - About - Password requirements established by the web service provider), allowing you to use pencil-and-paper methods with a much larger plaintext alphabet than those used with more conventional implementations of these methods. Although it is possible to re-create the tabula used with larger plaintext alphabets by hand, it is tedious and time-consuming, and for this reason was not readily adopted even when the pencil-and-paper methods were in widespread use. Encryptor allows you to use a larger plaintext alphabet than more conventional implementations easily and without re-creating the tabula by hand.
The cipher types and corresponding encryption algorithms used by Encryptor are well-known and were selected to provide the user with the basis for an effective personal encryption algorithm. For example, the cipher types variously allow the user to: use a robust keyword to generate a ciphertext alphabet which varies depending on the allowed character set, use continuously running text as a key, or use plaintext as part of the key.
The use of a personal encryption algorithm allows the user to select parsable tokens which are memorable. Encryptor stores the parsable tokens as a convenience to the user, but allows the user to mark some or all of them as private data, which is handled specially by Encryptor. As a result, Encryptor makes it possible to easily and quickly generate a conforming password or other authentication token without disclosing or recording the details required to re-create the password.
As a result, ciphertext can be reproduced using pencil-and-paper methods.
Although the algorithms used to encipher plaintext are well-known, your selection of parsable tokens is unique. The combination of letters, digits, and special characters allowed by the web service provider may also be unique. As a result, for the plaintext lengths typically encountered when selecting passwords for web service providers (typically between 6 and 16 characters in length), the ciphertext is indistinguishable from random text.
Select one or more encryptors, select "Export...", and archive the resulting XML file with a password, wrap it in an encrypted disk partition, or otherwise secure it. Send the resulting file to anyone you want by any means available. They'll be able to import the encryptor or encryptors you exported directly into their copy of Encryptor, provided you also share the access credentials to your file.
This is consistent with Allen's commitment to client confidentiality (see Allen Analytical - About - Allen Analytical's commitment to client confidentiality).
Encryptor records the details of password generation which are outside your control. For example, Encryptor supports the use of an arbitrary set of special characters defined by your web service provider. As a result, although this will not make an eight-character password a sixteen-character password, the potential search space is as large as the web service provider allows.
You may further customize the search space, for example, by taking advantage of a potential attacker's assumptions about it. For example, you may deselect all options defining characteristics of the base alphabet such as "Upper case characters", "Lower case characters", and "Decimal digits", and enter a subset of any or all of these into the special character set box.
In addition, by marking the keyword, key, or plaintext as private data, you gain an additional level of security when sharing an encryptor. The private data necessary to re-create the conforming password must be communicated via some other channel.
Encryptor uses parsable tokens which you specify to encipher plaintext. In addition, Encryptor supports the development and use of a personal encryption algorithm known only to you. Your personal encryption algorithm is the method by which the details of password generation which are outside your control and parsable tokens you specify are combined to generate a conforming password or other authentication token.
As a result, the same memorable parsable tokens may be used to generate different conforming passwords for multiple web service providers without exposing the parsable tokens to discovery.
Endnotes:
For example, Apple periodically mails the cleartext "privacy password" used to "prevent others from messing with your subscription" to Apple Mailing List subscribers, potentially disclosing it to third parties. Apple states: "Do not use a valuable password as it will occasionally be emailed back to you in cleartext."[1] (emphasis in the original). If this password is also used to protect the Apple ID associated with the email account to which it is mailed, an attacker may be able to access the account. As a result, it is unwise to use this "privacy password" for the Apple ID associated with the email address to which it is sent.
References:
Some web service providers require conforming passwords to contain both upper and lower case characters, decimal digits, and special characters, or any combination thereof. Some web service providers may not reject a password which does not use both upper and lower case characters, decimal digits, and special characters, but it is in the best interests of the user to select a password which meets these requirements so that the potential search space is as large as the web service provider allows. In addition, the allowed special characters vary from web service provider to web service provider. As a result, some password requirements established by web service providers are outside your control.
Encryptor records the details of password generation which are outside your control. Users may change these at any time using the "Encryptor Preferences" button. This allows the user to record the unique requirements for each combination of name and domain. It is advisable to determine what the requirements are before generating a conforming password, because changing the requirements after generating a conforming password will change the password Encryptor generates.
The following options are supported:
The default character set is ISO-8859-1 (commonly referred to as "Latin-1") . Future revisions may allow the user to select alternate character sets.
The special character set.
Enter any arbitrary combination of characters. The unique special character set is extracted from this value (see Encryptor - About - Intermediate variables).
Encryptor's default special character set contains graphic characters of the 7-bit ISO-8859-1 character set, including space, which is a "...normally non-printing graphic character...": !"#$%&'()*+,-./:;%lt;=>?@[\]^_`{|}~
Encryptor provides visual feedback to the user to allow the user to easily confirm plaintext (for cipher type "None") or ciphertext (for all other cipher types) satisfies the complexity requirements specified by the user via application and encryptor preferences.
Although Encryptor evaluates either the plaintext or ciphertext, depending on cipher type, the word "ciphertext" will be used throughout this discussion exclusively for clarity and simplicity. Where the word "ciphertext" is used, it should be understood that it means either plaintext or ciphertext, depending on cipher type.
In general:
Encryptor supports several simple checks for ciphertext complexity requirements:
The ciphertext must be of length greater than or equal to the minimum length selected by the user.
The slider allows the user to select a minimum length of one (1) to 16 characters. The default minimum length is eight (8). Users desiring a minimum length greater than 16 characters are encouraged to use option "Use regex mask" to evaluate the ciphertext.
The ciphertext must be of length less than or equal to the maximum length selected by the user.
The slider allows the user to select a maximum length of one (1) to 16 characters. There is no default maximum length. Users desiring a maximum length greater than 16 characters are encouraged to use option "Use regex mask" to evaluate the ciphertext.
As useful as the simple checks are, they do not provide a way for the user to confirm, for example, that the ciphertext contains at least two decimal digits, or no more than three consecutive identical characters.
In addition to the simple checks, Encryptor provides a more complex check for complexity requirements using a regular expression which may be used in lieu of, or in combination with, the simple checks:
Encryptor cannot use an invalid regular expression to evaluate the ciphertext. Encryptor will not delete an invalid regular expression entered by the user, but unchecks option "Use regex mask" and reports:
The regex mask entered for this encryptor is invalid.
The regex mask was not deleted, but option "Use regex mask" was unchecked for this encryptor.
Please confirm the regular expression entered is valid.
The keyword.
Enter any arbitrary combination of characters. The unique, valid keyword is extracted from this value (see Encryptor - About - Intermediate variables).
The unique, valid keyword is used to generate the ciphertext alphabet. The ciphertext alphabet is used to generate the tabula for cipher types other than "Keyword substitution". If no keyword is provided, the ciphertext alphabet is based on the unmodified plaintext alphabet1.
The key.
Enter any arbitrary combination of characters. The valid key is extracted from this value (see Encryptor - About - Intermediate variables).
The plaintext to encrypt.
Enter any arbitrary combination of characters. The valid plaintext is extracted from this value (see Encryptor - About - Intermediate variables).
Changes to a parsable token may not result in changes to the corresponding intermediate variable. For example, Encryptor generates the unique, valid keyword "albrecht" for all of the following keywords and conditions:
Endnotes.
The ciphertext alphabet.
The ciphertext alphabet is generated by appending all characters of the plaintext alphabet not used by the unique, valid keyword to the unique, valid keyword in the order in which they occur in the plaintext alphabet. This is algorithmically identical to generating the first row of the tabula.
The plaintext alphabet.
The plaintext alphabet is generated by combining characters from the character set(s) selected by the user: upper case letter, lower case letter, decimal digits, or unique special. The plaintext alphabet is sorted in ascending order. The sort order of the plaintext alphabet cannot be changed.
If only the 7-bit characters in the ISO-8859-1 character set (commonly referred to as "Latin-1") are selected, the plaintext alphabet is the ASCII character set[1], and is sorted in ascending ASCII order.
Encryptor's default plaintext alphabet contains 95 characters: the upper case letters A through Z, lower case letters a through z, decimal digits 0 through 9, and graphic characters of the 7-bit ISO-8859-1 character set (the ASCII character set), including space, which is a "...normally non-printing graphic character..."
The unique special character set.
The unique special character set is generated by extracting unique special characters from the special character set entered by the user.
The unique, valid keyword.
The unique, valid keyword is generated by first extracting valid characters, then unique characters, from parsable token "keyword", in the order in which they occur in parsable token "keyword".
If the unique, valid keyword contains all characters of the plaintext alphabet, the ciphertext alphabet is identical to the unique, valid keyword.
The valid key.
The valid key is generated by extracting valid (but not necessarily unique) characters from parsable token "key", in the order in which they occur in parsable token "key".
Although a key may be arbitrarily long, in practice it is not an advantage if the length of the valid key is significantly greater than the length of the valid plaintext.
The cipher type determines how Encryptor encrypts plaintext using the valid key (see Encryptor - Validation - Cipher type implementation for standard test cases used to validate Encryptor's implementation of cipher type):
A valid key is not required. Any value entered here is ignored.
A valid key is not required. Any value entered here is ignored.
A valid key is required.
If the length of the valid key is zero, the user is informed that a valid key is required. No ciphertext is generated.
If the length of the valid key is greater than zero, but less than the length of the valid plaintext, the valid key is appended to itself until the length of the valid key is greater than or equal to the length of the valid plaintext. The result is used to encrypt the valid plaintext using the tabula.
If the length of the valid key is greater than or equal to the length of the valid plaintext, the valid key is used to encrypt the valid plaintext using the tabula. There is no difference between cipher type "Vigenère" and cipher type "Running key" if the length of the valid key is greater than the length of the valid plaintext. The user is informed that the cipher type is effectively "Running key".
A valid key is optional.
If the length of the valid key is zero, the valid plaintext is used to encrypt itself using the tabula.
If the length of the valid key is less than the length of the valid plaintext, the valid plaintext is appended to the valid key. The result is used to encrypt the valid plaintext using the tabula.
If the length of the valid key is greater than or equal to the length of the valid plaintext, the valid key is used to encrypt the valid plaintext using the tabula. There is no difference between cipher type "Autokey" and cipher type "Running key" if the length of the valid key is greater than the length of the valid plaintext. The user is informed that the cipher type is effectively "Running key".
A valid key is required.
If the length of the valid key is less than the length of the valid plaintext, the user is informed that a valid key is required and that the length of the valid key must be greater than the length of the valid plaintext. No ciphertext is generated.
If the length of the valid key is greater than or equal to the length of the valid plaintext, the valid key is used to encrypt the valid plaintext using the tabula.
The valid plaintext.
The valid plaintext is generated by extracting valid (but not necessarily unique) characters from parsable token "plaintext", in the order in which they occur in parsable token "plaintext".
References:
When requested by the user, Encryptor stores the authentication details associated with an encryptor in the user's default keychain as a keychain item using the Mac OS X v10.6 Keychain Services API ("Keychain Services API"). The default keychain is usually, but not necessarily, the login keychain. The user may use Keychain Access to designate a keychain other than the login keychain as the default, but Encryptor stores keychain items in the default keychain.
The Keychain Services API supports the creation of keychain items for three types of password: "Internet password", "generic password", and "AppleShare password". Currently, Encryptor supports the creation of keychain items for type "Internet password". This is because Encryptor's primary core feature is the generation of a password which meets the minimum requirements established by a web service provider, i.e., a conforming password (see Encryptor - Support - Glossary). Encryptor does not yet support the creation of keychain items for passwords of type "generic password" or "AppleShare password", although this is a potential requested feature.
When creating, modifying, finding, or deleting a keychain item for an Internet password, Encryptor determines the scheme (see optional parameter Protocol, below), server name, port, and path by parsing field "Domain" entered by the user as a URL. The URL providing these parameters must conform to RFC 2396. The Keychain Services API parses the URL in accordance with RFCs 1738[1] and 1808[2].
To create a keychain item, three parameters are required:
The following parameters are not required to create a keychain item, but may be required to use a keychain item:
The protocol associated with the "scheme" of the URL.
The Internet Assigned Numbers Authority (IANA) maintains a registry of permanent and provisional URI schemes[3].
The Keychain Services API provides a method for determining the scheme of a URL conforming to RFC 1808. Because the Keychain Services API method used to find an Internet password returns the first Internet password based on the parameters passed, keychain items representing Internet passwords are not guaranteed to be unique, and it is advantageous to provide as much information as possible to ensure the first Internet password is the correct one before modifying or deleting a keychain item. It is therefore desirable to determine the scheme of a URL so that a user accessing an ftp:// resource or http:// resource requiring authentication can elect to use two separate Internet passwords for the same server name.
To create separate Internet passwords for these resources, the Keychain Services API requires Encryptor to specify the protocol associated with each resource. However, there is no reliable correspondence between scheme and protocol. For example:
The Keychain Services API defines 35 protocols, only ten (10) of which correspond to permanent schemes recognized by IANA. Encryptor supports the creation of Internet passwords for 24 protocols, ten (10) of which correspond to permanent schemes recognized by IANA and 14 of which do not:
This does not prevent a user from specifying a scheme which is not recognized as a valid protocol. When Encryptor is unable to determine the scheme of the URL, it creates a keychain item with no specific protocol. However, because the Keychain Services API method used to find an Internet password returns the first Internet password based on the parameters passed, keychain items representing Internet passwords are not guaranteed to be unique. As a result, Encryptor is unable to use the protocol to ensure the first Internet password is the correct one when modifying or deleting a keychain item.
For example, Encryptor can be used to generate an Internet password for schemes "sftp" and "ftp" using the same account name and server name. The first will be stored with no specific protocol and the second as protocol "ftp". However, when multiple keychain items are created using the same account name and server name with schemes that have no corresponding protocol, there is a possibility that some collision will occur.
This does not affect the creation of keychain items. However, when multiple keychain items are created using the same account name and server name with schemes that have no corresponding protocol, users may have to use Keychain Access to modify or delete a keychain item.
The following parameters are supported by the Keychain Services API, but are currently not used by Encryptor:
Encryptor may not be able to create keychain items using information provided by the user. In general, Encryptor may not be able to create a keychain item for two reasons:
In general, this is because incorrect or inadequate information is provided by the user. Encryptor determines the scheme (see optional parameter Protocol, above), server name, port, and path by parsing field "Domain" entered by the user as a URL:
That is, the keychain entry created by Encryptor does not conform to the user's expectations.
The question of non-conformity is tricky. The URL may begin with an unknown scheme or use non-standard port numbers which are perfectly valid. Encryptor attempts to use the information provided by the user to the extent possible, but problems may occur. If you encounter a specific problem which impacts your ability to use the keychain, please contact Allen.
References:
Encryptor prints the currently selected encryptor or first selected encryptor if more than one are selected ("selected encryptor"). If the cipher type of the selected encryptor is:
The "Print..." command (⌘P) is disabled.
Encryptor calculates the horizontal padding and offset necessary to center the plaintext and ciphertext alphabets ("alphabets") of the selected encryptor on one (1) page, and prints the alphabets.
Encryptor calculates the number of vertically- or horizontally-tiled pages necessary to print the plaintext alphabet and tabula recta ("tabula") of the selected encryptor, calculates the vertical and horizontal padding and offset necessary to center the tabula (or portion of the tabula) on each page, centers the tabula on the tiled pages, and prints the tabula.
The number of vertically- and horizontally-tiled pages is calculated using a default line height of 1.5 and default point size of 10 points. Encryptor calculates the number of pages necessary to print the tabula using the printable area of the page. Changing the paper size or printing to a different printer affects these values. I am unable to test all possible configurations, so please send me an email if you encounter any problems when printing a tabula.
The tabula is, by necessity, square. However, the variant of the Vigenère, autokey, or running key cipher used by Encryptor does not necessarily use the plaintext alphabet as the first row of the tabula. If the user does not specify a keyword, the plaintext and ciphertext alphabets are the same and the first row of the tabula is identical to the plaintext alphabet. As a result, one additional row is required to print the plaintext alphabet.
It is possible to calculate the number of pages required to print the tabula. The following example is based on 38 columns per page by 48 rows calculated using the default line height of 1.5 and default font point size of 10 points, and the printable area of letter size paper when printing to a Samsung ML-1450, and shows the number of pages required to print the tabula for a plaintext or ciphertext alphabet having a length within the ranges indicated in the table. The number of rows is one less than might be expected based on the number of rows per page, because Encryptor prints the plaintext alphabet above the tabula. This reduces the number of rows available for printing the tabula on the first page to 47:
| Columns | 1 - 38 | 39 - 76 | 77 - 114 | 115 - 152 | 153 - 190 | |
| Rows | Pages | 1 | 2 | 3 | 4 | 5 |
| 1 - 47 | 1 | 1 - 38 | 39 - 47 | X | X | X |
| 48 - 95 | 2 | X | 48 - 76 | 77 - 95 | X | X |
| 96 - 143 | 3 | X | X | 96 - 114 | 115 - 143 | X |
| 144 - 191 | 4 | X | X | X | 144 - 152 | 153 - 190 |
There are certain circumstances under which Encryptor cannot center the tabula. If the number of characters in either the vertical or horizontal dimension is even, Encryptor distributes the tabula evenly over the outer pages in that dimension when printing. If the number of characters in either dimension is odd, Encryptor cannot evenly distribute the tabula and prints an odd number of rows or columns on the top page(s) (for vertically tiled pages) or the left page(s) (for horizontally tiled pages), and an even number of rows or columns on the bottom or right page(s).
Because one additional row is required to print the plaintext alphabet, there will always be either an odd number of columns or rows, while the corresponding number of rows or columns will be even. As a result, the only circumstances under which print output is both vertically and horizontally symmetrical is when no tiling is necessary to print the tabula, or when the number of vertically- or horizontally-tiled pages in the long dimension (based on "Page Setup... > Orientation"), for example, the 11-inch side of letter size paper, is one, and the alphabets contain an even number of characters when the long dimension is vertical or an odd number when the long dimension is horizontal.
Future revisions will allow the user to print multiple encryptors at a time and implement a print dialogue featuring options allowing the user to:
Encryptor provides a way to mark parsable tokens as private data. Private data is handled specially by Encryptor:
The rationale for private data is multi-layered security, or defense in depth, one of Encryptor's design goals (see Encryptor - About - What makes Encryptor different from other password generators or managers?).
Encryptor remembers which parsable tokens are locked and unlocked for each encryptor. This is a convenience to allow the user to require Encryptor to prompt to delete a parsable token without which the conforming password or other authentication token cannot be re-created. After marking a parsable token as private data, Encryptor will prompt the user to clear private data before saving or quitting every time the user enters the parsable token for the encryptor.
There are three Remember... buttons, one for each parsable token (see Encryptor - About - Parsable tokens): Remember Keyword, Remember Key, and Remember Plaintext. The Remember... buttons lock or unlock the corresponding parsable token. By default, parsable tokens are locked, i.e., they are NOT marked as private data. The default may be changed for all encryptors (using application preferences) or for each encryptor individually (using encryptor preferences).
Clicking a Remember... button to reveal the "Locked" icon will lock the corresponding parsable token(s) for the selected encryptor(s). Encryptor stores all locked parsable tokens, i.e., parsable tokens NOT marked as private data, when saving or quitting.
Clicking a Remember... button to reveal the "Unlocked" icon will unlock the corresponding parsable token(s) for the selected encryptor(s), marking the parsable token(s) as private data.
Changes to parsable tokens marked as private data will not be recorded as a change, and will not change the date the encryptor was last modified.
The Rotate [parsable token]... buttons1 are enabled only if the corresponding parsable token for the selected encryptor is marked as private data, and disabled otherwise.
Clicking the Rotate [parsable token]... buttons will cause Encryptor to attempt to find a match for the complexity requirements for the selected encryptor by replacing the parsable token entered by the user with a parsable token containing all of the characters of the parsable token in a different order. The Rotate [parsable token] Left buttons attempt to find a match by rotating [parsable token] to the left. The Rotate [parsable token] Right buttons attempt to find a match by rotating [parsable token] to the right.
The rationale for parsable token rotation is multi-layered security, or defense in depth, and memorability, two of Encryptor's design goals (see Encryptor - About - What makes Encryptor different from other password generators or managers?). Both Rotate [parsable token] Left and Rotate [parsable token] Right buttons are provided to support their use in the user's personal encryption algorithm, in particular in environments where passwords are required to be changed frequently. Together, they allow the user to generate a new conforming password using the same parsable tokens used to generate the existing conforming password.
For example (see Encryptor - Tutorial (T01) - Generating a password), if the user marks the plaintext "Plaintext:" as private data and then clicks the Rotate Plaintext Right button, Encryptor reports: "Found a match for this plaintext." and replaces the plaintext entered by the user with ":Plaintext".
Multiple matches are possible. For example (see Encryptor - Tutorial (T01) - Generating a password), if the user marks the plaintext "Plaintext:" as private data and then clicks the Rotate Plaintext Right button, Encryptor cycles through the following plaintext: "Plaintext:", ":Plaintext", "t:Plaintex", "xt:Plainte", "ext:Plaint", "text:Plain", "ntext:Plai", "intext:Pla", "aintext:Pl", and "laintext:P", before returning to "Plaintext:". With each rotation, Encryptor generates ciphertext that satisfies the complexity requirements. This is not typical.
Users may unlock a parsable token, rotate it to generate ciphertext that satisfies the complexity requirements, and lock it again without changing the date the encryptor was last modified (see Encryptor - Features - Private data).
Endnotes.
If you have a question that is not addressed by the help available below, please contact Allen.
Most web service providers require or recommend the user select a password that is a mix of upper and lower case characters, decimal digits, and special characters, but do not disclose what special characters are allowed until after the user selects a password, confirms the password, and goes through a "password strength" check.
As a result, the user may select the strong, but memorable, password "sPo0kyh@l|0w3En" only to discover that the "@" or "|" (vertical pipe) symbols, both of which are used, are not allowed. The password is therefore not a conforming password.
After the web service provider reports this to the user, the user is forced to select another password and hope the special characters used are allowed. If the web service provider discloses the allowed special character set, it is more likely to do so after the user has selected a password containing special characters that are not allowed.
This is a worst practice, but it is very common. For example, at the time of account creation:
Google:
Monster:
Facebook:
Because most web service providers do not disclose what special characters are allowed before the user selects a password, users of Encryptor may have to experiment to determine the allowed special character set when using Encryptor to generate a password.
Users of Encryptor may not be able to determine the allowed special character set unless they first generate a password containing a special character that is not allowed. Also, users of Encryptor may generate a password which does not contain a special character that is not allowed using a special character set which includes characters that are not allowed.
In the latter case, users of Encryptor should be aware that changing the special character set saved with the encryptor may change the ciphertext. If the ciphertext is being used as a password, users of Encryptor should be particularly careful when changing the special character set while using Encryptor to change the existing password. Encryptor fully supports "undo" operations, but undo history is not saved when the user quits. As a result, users of Encryptor should create a new encryptor using the revised special character set to avoid deleting ciphertext generated using the existing special character set, and which will be needed to change the existing password.
One of the design goals of Encryptor was: Encryptor will solve one of the most common problems with passwords, memorability, by allowing the user to use memorable parsable tokens to generate conforming passwords or other authentication tokens (see Encryptor - About - What makes Encryptor different from other password generators or managers?).
By design, Encryptor uses memorable words and phrases to generate conforming passwords or other authentication tokens which are indistinguishable from random text using pencil-and-paper methods. However, in order to ensure a conforming password is generated, it would be necessary to implement an algorithm which selects words and phrases at random, and which result in a password which satisfies the complexity requirements. Expecting the user to remember these words and phrases is no different than expecting the user to remember any other randomly-generated password, because they are not memorable, by definition.
In addition, one of the common problems with passwords Encryptor is designed to solve is uniqueness. The purpose of Encryptor is to allow users to combine something they have, i.e., a document recording their choices, with something they know, i.e., their personal encryption algorithm, and create a unique password for each web service provider. An algorithm which selects words and phrases at random on your behalf is not a personal encryption algorithm.
Generally:
More specifically:
Selecting a long, complex keyword creates entropy in the ciphertext alphabet. The maximum amount of entropy is achieved when the keyword contains all of the characters of the plaintext alphabet, and the order of their occurrence in the keyword has been sufficiently randomized.
Most web service providers require or recommend the user select a password that is a mix of upper and lower case characters, decimal digits, and special characters, but do not disclose what special characters are allowed until after the user selects a password, confirms the password, and goes through a "password strength" check... (see Encryptor - Support - Determining the allowed special character set).
Internet passwords stored in the default keychain by Encryptor are available to native Mac OS X applications, such as Mail. However, users are advised to review the format of a saved password to ensure the authentication details provided to Encryptor, and stored in the default keychain, are in the expected format... (see Encryptor - A note to Apple Mail users).
Unfortunately, Firefox does not natively support Mac OS X Keychain Services.
An extension exists which supports Keychain Services integration, but this extension is unreliable and documentation in its use is virtually non-existent.
Until better Keychain Services integration for Firefox is available, the best practice for using Encryptor with Firefox... (see Encryptor - A note to Firefox users).
The features of Encryptor which are tested before any release is considered to be validated are:
Encryptor's primary feature is performing operations on parsable string tokens to transform a plaintext string into a ciphertext string conforming to known requirements in accordance with a known encryption algorithm.
All encryption algorithms used by Encryptor are pencil-and-paper methods which may be validated by hand. In general, they are suitable for encrypting small amounts of plaintext, such as a password, but should not be confused with modern cryptographic methods.
Several encryption algorithms used by Encryptor were once considered indecipherable, and Encryptor will encrypt plaintext using a one-time pad as the key. However, the security of a one-time pad requires it never be used again, which defeats the purpose of storing it and would require that a password, for example, be changed every time it is used.
Before every release, Allen evaluates Encryptor's ability to transform plaintext into ciphertext using standard test cases (see Encryptor - Validation - Standard test cases). The standard test cases have been manually validated, that is, validated by hand using pencil and paper.
The reproducible bug bounty is: Manually encrypted ciphertext shall equal the ciphertext in field "Ciphertext" for every standard test case before the results reported by Encryptor to the user will be considered to be correct and the release considered validated.
The standard test cases described are available as an XML document for download (see Encryptor - Downloads - Standard test cases). Import (⌘I) that document into Encryptor to validate Encryptor. The manually encrypted ciphertext is given in field "Comment".
Before every release, Allen confirms that private data is cleared on "Save", "Save as...", or "Quit" when requested by the user. Encryptor's file save and quit behavior is described in the following document: Encryptor - Support - File save and quit behavior.
The reproducible bug bounty is: Private data shall be cleared on "Save", "Save as...", or "Quit" when requested by the user in accordance with the behavior described in the document above.
Before every release, Allen confirms that Encryptor's user interface is resized appropriately when the user resizes the window.
The reproducible bug bounty is: Encryptor's user interface shall be resized appropriately when the user resizes the window.
Before every release, Allen confirms that Encryptor imports encryptors exported by previous versions of Encryptor.
The reproducible bug bounty is: Later versions of Encryptor shall import encryptors exported by previous versions of Encryptor.
Note that Encryptor will both Export (⌘E) encryptors as an XML file ("exported XML file") and Save (⌘S) a document as an XML file ("saved XML file")1. Later versions of Encryptor will open a saved XML file, but saved XML files are incompatible with exported XML files, and cannot be imported. Likewise, exported XML files are incompatible with saved XML files, and cannot be opened.
Before every release, Allen confirms that Encryptor exports valid XML using the World Wide Web Consortium (W3C) Markup Validation Service[1]. This is consistent with Allen's commitment to data portability (see Allen Analytical - About - Allen Analytical's commitment to data portability).
The reproducible bug bounty is: Encryptor shall export valid XML.
The following features are not eligible for Allen's Reproducible Bug Bounty:
Printing errors are not eligible for Allen's Reproducible Bug Bounty.
Validation of Encryptor's print behavior is described in the following document: Encryptor - Validation - Printing.
Briefly, the problem is:
...validation of Encryptor's print behavior is based on 38 columns per page by 48 rows calculated using the default line height of 1.5 and default font point size of 10 points, and the printable area of letter size paper when printing to a Samsung ML-1450. Changing the paper size or printing to a different printer affects the size of the printable area of the page, and the maximum number of columns or rows which may be printed.
Although Allen is unable to test all possible print configurations, please report printing errors.
References:
Endnotes.
Briefly, because it is consistent with Allen's commitment to data portability (see Allen Analytical - About - Allen Analytical's commitment to data portability).
Encryptor supports both exported XML files and saved XML files because Allen may version the Core Data model which describes an encryptor in a future release of Encryptor, but is unable to guarantee all future releases will support all previous versions of the Core Data model. In general, each major release of Encryptor will support all versions of the previous major release's Core Data model, if any. Saved XML files based on previous versions of the Core Data model will be migrated to later versions of the Core Data model automatically when Encryptor is updated and a saved XML file is opened for the first time. Any exceptions will be documented. There are currently no exceptions.
It is important to maintain a distinction between the document and the file throughout the discussion that follows because the contents of the document and the contents of the file may not be the same:
Encryptor's file save and quit behavior is based on the contents of the document, not the contents of the file. In every case where the file is not modified, the file contains private data if the document contained private data when it was last saved, i.e., private data WAS NOT cleared before saving.
If the user selects:
Present the "Don't save", "Cancel", or "Save" dialogue to the user. If the user selects:
Quit normally.
Cancel the Quit.
Save as described in "Save (⌘S)", below.
Quit normally.
Present the "Don't save", "Cancel", or "Save" dialogue to the user. If the user selects:
Quit normally. The file is not modified, and may contain private data.
Cancel the Quit.
Save as described in "Save (⌘S)", below.
Present the "Clear private data...?" dialogue to the user. If the user selects:
Quit without clearing private data. The file is not modified, and contains private data.
Cancel the Quit. The file is not modified, and contains private data.
Quit normally. The file is not modified, and does not contain private data.
Present the "Clear private data...?" dialogue to the user. If the user selects:
Save the document without clearing private data. A file is created, and the file contains private data.
Cancel the Save, allowing the user to clear private data and then Save. A file is not created.
Save normally. A file is created, and the file does not contain private data.
Present the "Clear private data...?" dialogue. If the user selects:
Save without clearing private data. The file is modified, and contains private data.
Cancel the Save, allowing the user to clear private data and then Save. The file is not modified.
Save normally. The file is modified, and does not contain private data.
Endnotes.
The design goals of Encryptor include: "The user will retain control of their data." and "Encryptor will encourage multi-layered security, or 'defense in depth'."
Conforming passwords or other authentication tokens generated using Encryptor are indistinguishable from random text. As a result, the same memorable parsable tokens may be used to generate different conforming passwords for multiple web service providers without exposing the parsable tokens to discovery.
Although most web service providers store your password or other authentication tokens as a hash, or salted hash, which makes recovery difficult, some do not. In addition, transmitting your password or other authentication tokens over a non-secure connection exposes them to every web server between your computer and the web service provider.
Encryptor cannot solve these problems. Indeed, no action on your part can guarantee disclosure of the password or other authentication tokens you generate using Encryptor is prevented.
However, if inadvertent disclosure is a concern, for example because others have access to an unprotected file recording authentication details, several strategies may be helpful:
Allen recommends users of Encryptor use the features of the filesystem or operating system to secure saved documents using filesystem or whole disk encryption, for example: FileVault or a third-party utility such as TrueCrypt to encrypt a hard drive, or Disk Utility to create an encrypted partition. By default, saved documents created using Encryptor have a "eosx" extension, but users may elect to save XML or SQL documents created using Encryptor as "xml" or "sql" files.
Encryptor provides a way to mark parsable tokens as private data. Private data is handled specially by Encryptor (see Encryptor - Features - Private data).
See Encryptor - Tutorial (T02) - Generating a conforming password for an example.
For example:
For example, append or prepend "_d0G" or "2S!n" to the ciphertext generated by Encryptor. Adjust the token as necessary to satisfy the plaintext alphabet characteristics established by the web service provider. If the plaintext alphabet contains upper and lower case characters and decimal digits but no special characters, use "d0G" or "2Sn". If the plaintext alphabet contains upper and lower case characters and special characters, but no decimal digits, use "_dG" or "S!n".
For example, Encryptor generated the conforming password (see Encryptor - Tutorial (T07) - Encrypting plaintext):
1TWaevTW
However, both:
11TTWWaaeevvTTWW 111TTTWWWaaaeeevvvTTTWWW
are also conforming passwords.

Throughout this document, the words "selected encryptor(s)" are used to describe controls which affect multiple encryptors. The words "selected encryptor" are used to describe controls which affect the first selected encryptor, even when more than one encryptor is selected.
Encryptor's user interface includes a number of elements and controls:
Enter a search term. Encryptor filters the list of encryptors as you type so that only encryptors with an account name, domain, or comment containing the search term are displayed.
The list of encryptors created by the user.
The default account name is "username".
If no encryptor is selected, the default domain is "domain".
If an encryptor is selected, the new encryptor will have the same domain as the domain of the selected encryptor. This is useful when creating several accounts at a time, for example, if you are an administrator creating passwords for users of your site.
Comments are not required, but useful to store the names of businesses, for example, which cannot be readily determined by examining the domain.
Fields "Added" and "Modified" display the date the encryptor was created and the date the encryptor was last modified, respectively. These fields are not editable.
Click the New Encryptor button to create a new encryptor, or select "File > New Encryptor" (⇧⌘N).
Click the Delete Encryptor button to delete the selected encryptor(s), or select "File > Delete Encryptor" (⌘D).
Click the Clear Private Data button to clear private data (see Encryptor - Features - Private data).
Click the Encryptor Preferences button to change the preferences for the selected encryptor.
Click the Confirm Ciphertext button to open the confirmation dialogue window.
Click the Cipher type button to change the cipher type for the selected encryptor(s). Select one of the following cipher types:
The default cipher type is "Vigenère".
Changing the cipher type updates the user interface:
Fields "Keyword", "Key", and "Ciphertext" are disabled.
Field "Key" is disabled.
This does not prevent the user from storing data in these fields. First, select a cipher type that uses a keyword and key, and generates ciphertext: "Vigenère", "Autokey", or "Running key". Enter the keyword and key, then change the cipher type to "None" or "Keyword substitution". Encryptor will retain the keyword and key entered.
Enter the keyword for the selected encryptor(s). The keyword is a parsable token (see Encryptor - About - Parsable tokens).
Field "Keyword" is disabled for cipher type "None".
Click the Remember Keyword button to mark the keyword as private data (see Encryptor - Features - Private data):
Click the Rotate Keyword Left button to attempt to find a match for the complexity requirements for the selected encryptor by rotating the keyword to the left.
This is an advanced feature (see Encryptor - Advanced Features). The Rotate Keyword Left button is enabled if the keyword is marked as private data, and disabled otherwise.
Click the Rotate Keyword Right button to attempt to find a match for the complexity requirements for the selected encryptor by rotating the keyword to the right.
This is an advanced feature (see Encryptor - Advanced Features). The Rotate Keyword Right button is enabled if the keyword is marked as private data, and disabled otherwise.
This field displays the unique, valid keyword (see Encryptor - About - Intermediate variables). The unique, valid keyword cannot be changed by entering a value in this field, but only by changing the keyword.
Enter the key for the selected encryptor(s). The key is a parsable token (see Encryptor - About - Parsable tokens).
Field "Key" is disabled for cipher types "None" and "Keyword substitution".
Click the Remember Key button to mark the key as private data (see Encryptor - Features - Private data):
Click the Rotate Key Left button to attempt to find a match for the complexity requirements for the selected encryptor by rotating the key to the left.
This is an advanced feature (see Encryptor - Advanced Features). The Rotate Key Left button is enabled if the key is marked as private data, and disabled otherwise.
Click the Rotate Key Right button to attempt to find a match for the complexity requirements for the selected encryptor by rotating the key to the right.
This is an advanced feature (see Encryptor - Advanced Features). The Rotate Key Right button is enabled if the key is marked as private data, and disabled otherwise.
This field displays the valid key (see Encryptor - About - Intermediate variables). The valid key cannot be changed by entering a value in this field, but only by changing the key.
Enter the plaintext for the selected encryptor(s). The plaintext is a parsable token (see Encryptor - About - Parsable tokens).
Click the Remember Plaintext button to mark the plaintext as private data (see Encryptor - Features - Private data):
Click the Rotate Plaintext Left button to attempt to find a match for the complexity requirements for the selected encryptor by rotating the plaintext to the left.
This is an advanced feature (see Encryptor - Advanced Features). The Rotate Plaintext Left button is enabled if the plaintext is marked as private data, and disabled otherwise.
Click the Rotate Plaintext Right button to attempt to find a match for the complexity requirements for the selected encryptor by rotating the plaintext to the right.
This is an advanced feature (see Encryptor - Advanced Features). The Rotate Plaintext Right button is enabled if the plaintext is marked as private data, and disabled otherwise.
This field displays the valid plaintext (see Encryptor - About - Intermediate variables). The valid plaintext cannot be changed by entering a value in this field, but only by changing the plaintext.
This field displays the ciphertext generated by Encryptor.
Field "Ciphertext" is disabled for cipher type "None".
Click the Use Keychain button to allow Encryptor to create, modify, or delete keychain item(s) for the selected encryptor(s) (see Encryptor - Features - Mac OS X Keychain integration).
Click the Synchronize Keychain Item button to create a keychain item for the selected encryptor or change the password for an existing keychain item.
The Synchronize Keychain Item button is disabled when the keychain is not in use for the selected encryptor, or when the keychain is in use and the password for the selected encryptor matches the password for the keychain item.
The icon on the Synchronize Keychain Item button is an "Add" icon if there is no keychain item for the selected encryptor, and changes from an "Add" icon to a "Refresh" icon if there is a keychain item for the selected encryptor.
When the user makes a change which changes the ciphertext for the selected encryptor, for example a change to the plaintext alphabet characteristics or a parsable token, the Synchronize Keychain Item button is enabled. Clicking the Synchronize Keychain Item button will prompt the user to change the password for the keychain item.
Click the Delete Keychain Item button to delete the keychain item for the selected encryptor.
The Delete Keychain Item button is disabled when there is no keychain item for the selected encryptor, and enabled when there is a keychain item for the selected encryptor.
Encryptor provides visual feedback to the user to allow the user to easily confirm the plaintext (for cipher type "None") or ciphertext (for all other cipher types) satisfies the complexity requirements specified by the user via application and encryptor preferences (see Encryptor - About - Complexity requirements).
Encryptor reports various status messages here. For example, Encryptor reports "Created a keychain item for..." when it creates a keychain item, or "Found a match for this [parsable token]" when it finds a match for the complexity requirements for the selected encryptor by rotating the parsable token.
The purpose of Encryptor is to allow users to combine something they have, i.e., a document recording their choices, with something they know, i.e., their personal encryption algorithm.
Encryptor records the details of password generation which are outside your control as a convenience to you and uses parsable tokens which you specify to encipher plaintext. This is something you have.
Encryptor supports the development and use of a personal encryption algorithm known only to you. Your personal encryption algorithm is the method by which the details of password generation which are outside your control and parsable tokens you specify are combined to generate a conforming password. This is something you know.
The tabula recta (literally "square table").
The tabula recta is a latin square, specifically, a special case of a reduced latin square.
The tabula recta is generated from the ciphertext alphabet. The first row of the tabula is identical to the ciphertext alphabet. Each succeeding row of the tabula is shifted one character to the left from the preceding row. The number of rows and columns in the tabula recta is identical to the number of characters in the plaintext or ciphertext alphabet.
References:
This list is a list of published references which are cited in the documentation for Encryptor.
This list is not a comprehensive list of all references cited in the documentation for Encryptor. Allen does not consider documentation to which access is controlled exclusively by the originator to be published because this documentation is ephemeral and may be revised at any time. Frequently, the web service provider or other originator revises references without notifying the user that there has been a change, documenting what has changed, or following document control practices which were standard long before the advent of the Internet.
This does not mean that references accessible via the Internet, or only via the Internet, are unreliable. On the contrary, many of them are definitive. However, there is a qualitative difference between a Request for Comments (RFC) published by the Internet Engineering Task Force (IETF) as a technical document which defines a standard, and the user-level self-help available from Google or Facebook. The IETF states[1]: "Published RFCs never change."
Neither Google nor Facebook make, or indeed can make, such a claim about their user-level self-help, which changes frequently and without notice. As a result, the most reliable record of these requirements is a screen capture. In general, Allen considers the screen capture reliable and and the document to which the screen capture refers to be ephemeral. As a result, Allen considers the screen capture to be published, but not the document to which the screen capture refers.
References:
The purpose of this tutorial is to demonstrate how to use Encryptor to generate a password. For the purposes of this example, the password will not be a conforming password (see Encryptor - Support - Glossary). Generating a conforming password would require a focus on the minimum requirements established by a web service provider and not the use of Encryptor to generate a password.
Click the New Encryptor button to create a new encryptor, or select "File > New Encryptor" (⇧⌘N).
When a new encryptor is created, Encryptor will set the encryptor's preferences using the application preferences. However, the plaintext alphabet characteristics and ciphertext complexity requirements established by the web service provider may require the user to change the encryptor's preferences. If necessary, click the Encryptor Preferences button to change the encryptor's preferences.
Encryptor's default plaintext alphabet contains 95 characters: the uppercase letters A through Z, lowercase letters a through z, decimal digits 0 through 9, and graphic characters of the 7-bit ISO-8859-1 character set (the ASCII character set), including space, which is a "...normally non-printing graphic character..." (see Encryptor - About - Intermediate variables).
Encryptor's default ciphertext complexity requirements require a minimum length of eight (8) characters, but no restriction on maximum length, and the use of upper case letters, lower case letters, decimal digits, special characters, but no regex (regular expression) mask.
Accept the default plaintext alphabet characteristics and ciphertext complexity requirements. Click the Save button (Encryptor Preferences).
Enter the account name: "test". Press the "Enter" key or tab to the next field.
Although the Mac OS X Keychain Services API provides a method for determining the user portion of a URL conforming to RFC 1808, Encryptor uses the account name entered as field "Name" by the user (see Encryptor - Features - Mac OS X Keychain integration).
Enter the domain: "http://www.example.com". Press the "Enter" key or tab to the next field.
Encryptor determines the scheme, server name, port, and path by parsing field "Domain" entered by the user as a URL (see Encryptor - Features - Mac OS X Keychain integration).
Enter any comment (here "Example"), or no comment. Press the "Enter" key or tab to the next field.
Comments are not required, but useful to store the names of businesses, for example, which cannot be readily determined by examining the domain.
Select the cipher type: "Vigenère". Tab to the next field.
The cipher type determines how Encryptor encrypts plaintext using the valid key (see Encryptor - About - Intermediate variables).
Enter the keyword: "keyword". Press the "Enter" key or tab to the next field.
Because the keyword is a parsable token (see Encryptor - About - Parsable tokens), Encryptor immediately generates the unique, valid keyword and displays it in field "Unique, valid keyword". The unique, valid keyword cannot be changed by entering a value in this field, but only by changing the keyword.
Enter the key: "key". Press the "Enter" key or tab to the next field.
Because the key is a parsable token (see Encryptor - About - Parsable tokens), Encryptor immediately generates the valid key and displays it in field "Valid key". The valid key cannot be changed by entering a value in this field, but only by changing the key.
Enter the plaintext: "plaintext". Press the "Enter" key or tab to the next field.
Because the plaintext is a parsable token (see Encryptor - About - Parsable tokens), Encryptor immediately generates the valid plaintext and displays it in field "Valid plaintext". The valid plaintext cannot be changed by entering a value in this field, but only by changing the plaintext.
Because we have provided the valid key and valid plaintext required for cipher type "Vigenère", Encryptor immediately generates the ciphertext and reports that it does not satisfy the ciphertext complexity requirements: the ciphertext does not use upper case characters or decimal digits (indicated by a red cross next to those requirements).
Enter the plaintext: "Plaintext:". Press the "Enter" key or tab to the next field.
Encryptor immediately generates the ciphertext and reports that it satisfies all of the ciphertext complexity requirements (indicated by a green tick mark next to all requirements).
The purpose of this tutorial is to demonstrate how to use Encryptor to generate a conforming password. See Encryptor - Tutorial (T01) - Generating a password for more general information about using Encryptor to generate a password.
For the purposes of this tutorial, we will generate a conforming password for an Apple ID. The authentication details (i.e., the email address, domain, and password) used in this tutorial are for the purposes of example only, and were not used by Allen to register as an Apple developer.
Navigate to the Apple Developer registration page to register as an Apple Developer. Click "Get Started".
Select "Create an Apple ID" to create an Apple ID. Click "Continue" (not shown) to continue.
Launch Encryptor. Enter the account name, domain, and a comment for this encryptor2. Press the "Enter" key or tab to the next field.
The personal encryption algorithm in use in this example is based on field "Comment".
When a new encryptor is created, Encryptor will set the encryptor's preferences using the application preferences. However, the plaintext alphabet characteristics and complexity requirements established by Apple require us to change the encryptor's preferences. Click the Encryptor Preferences button to change the encryptor's preferences.
The complexity requirements established by Apple are published on the Apple Developer Registration page. This is a good practice.
The first requirement applies to all "personal profile information", including the password, and limits the plaintext alphabet to the 7-bit characters in the ISO-8859-1 character set:
Important: Your personal profile information should be entered in English and without using diacritical characters (for example: ü, é, ñ)
All other requirements apply specifically to the password.
Password must:
- Have at least one capital letter
- Have at least one number
- Not contain more than 3 consecutive identical characters
- Not be the same as the account name
- Be at least 8 characters
Some plaintext alphabet characteristics established by Apple are inferred from the complexity requirements: the plaintext alphabet includes upper case letters and decimal digits. However, Apple does not explicitly state the plaintext alphabet includes only upper case letters and decimal digits, and it would be unreasonable to assume that it does. Therefore, to ensure the potential search space is as large as Apple allows, the plaintext alphabet also includes lower case letters.
Apple does not disclose the allowed special character set, but does not require the use of special characters. This is a good practice3. Although most web service providers require the use of special characters, many web service providers do not disclose the allowed special character set until after the user selects a password, confirms the password, and goes through a "password strength" check (see Encryptor - Support - Determining the allowed special character set.).
The plaintext alphabet characteristics we will use are: "Use 7-bit character set", "Upper case characters", "Lower case characters", and "Decimal digits" (see Encryptor - About - Plaintext alphabet characteristics). We will delete the special character set.
Encryptor supports several simple checks for ciphertext complexity requirements. Although we could use a regex mask for all of the complexity requirements established by Apple (see Using a regex mask for all of the complexity requirements established by Apple), we will use the simple checks for all of the complexity requirements but one4, for which we will use a regex mask.
The simple checks we will use are: "Use minimum length", "Use upper case characters", "Use lower case characters", and "Use decimal digits" (see Encryptor - About - Complexity requirements).
To implement the check that the password not contain more than 3 consecutive identical characters, we will use a more complex check: "Use regex mask" and the following regex mask: "(?!^.*([A-Za-z0-9])\1{3,})^.*[A-Za-z0-9].*$" (without the double quotes).
Click the Save button (Encryptor Preferences).
Enter the keyword for this encryptor.
The personal encryption algorithm in use in this example is based on field "Comment", and will make use of one of the most common books in existence: the King James version of the Bible, although any book could be used, a similar method, or indeed any other reproducible method: the keyword is the complete text of the book, chapter, and verse corresponding to the first three letters of the text entered in field "Comment": "app".
The letter "a" is the first letter of the alphabet, and corresponds to the first book of the Bible: Genesis. The second letter "p" is the 16th letter of the alphabet, and corresponds to chapter 16. The third letter "p" corresponds to verse 16, which is the last verse of chapter 16 of the book of Genesis.
Our keyword is the complete text of Genesis 16:16: "And Abram was fourscore and six years old, when Hagar bare Ishmael to Abram."
If necessary, for example because the third letter of the text entered in field "Comment" was the letter "r" (for "April Communications, LLC") or the letter "t" (for "Aptive Measurement Incorporated"), the personal encryption algorithm in use in this example requires we "wrap around" the verses in chapter 16 to verse 1, which corresponds to the letter "q" which follows the letter "p" in the alphabet. The letter "r" therefore corresponds to verse 2 and the letter "t" to verse 4. A similar method could be used to "wrap around" the chapters or books if necessary.
Enter "And Abram was fourscore and six years old, when Hagar bare Ishmael to Abram." in field "Keyword" and click the Remember Keyword button to the right to reveal the "Unlocked" icon (see Encryptor - Tutorial (T04) - Clearing private data). We do not need Encryptor to remember the keyword for us because we can recover it at any time based on the personal encryption algorithm.
Press the "Enter" key or tab to the next field.
Enter the key for this encryptor.
The personal encryption algorithm in use in this example is based on field "Comment". The second word of field "Comment" is the key: "Developer".
Enter "Developer" in field "Key". We do not need Encryptor to remember the key for us because we can recover it at any time based on the personal encryption algorithm, but there is an advantage to not marking the key as private data which will become apparent later.
Press the "Enter" key or tab to the next field.
Enter the plaintext for this encryptor.
The personal encryption algorithm in use in this example is based on field "Comment", and provides both the keyword and key, but not the plaintext. We unlocked the keyword, and will be prompted to delete it before we Save or Quit. After we delete the keyword, the information stored by Encryptor alone cannot be used to re-create the ciphertext. As a result, for the purposes of this example, it does not matter what plaintext we enter. We can enter any arbitrary plaintext which results in a conforming password.
Enter "password" in field "Plaintext". Press the "Enter" key or tab to the next field.
Encryptor immediately generates the ciphertext and reports that it satisfies the ciphertext complexity requirements: the ciphertext is a conforming password. However, if this were not the case, we could enter any arbitrary plaintext which would result in a conforming password. We require Encryptor to store the plaintext.
Although we may not need Encryptor to store the plaintext for this encryptor, there is an advantage to not marking the plaintext as private data: when we clear private data, Encryptor deletes the keyword used to generate the conforming password for our Apple ID, and the resulting ciphertext is also a conforming password (see Encryptor - Tutorial (T04) - Clearing private data).
The obvious advantage is the ability to ensure anyone gaining access to an unprotected file will not be able to re-create the conforming password, although it does require careful selection of the plaintext. For all practical purposes, we create the illusion that no keyword was used, when this is in fact not the case.
At this point, the tutorial is complete. However, this tutorial provides a sound basis for demonstrating several other features of Encryptor: Encryptor - Tutorial (T03) - Using the confirmation dialogue window, Encryptor - Tutorial (T04) - Clearing private data, and Encryptor - Tutorial (T05) - Creating a keychain item.
Endnotes.
This tutorial is based on tutorial: Encryptor - Tutorial (T02) - Generating a conforming password, and uses the same plaintext alphabet characteristics, complexity requirements, and parsable tokens.
Previously:
We now want to confirm the password.
Encryptor provides visual feedback to the user to allow the user to easily confirm the parsable tokens used to generate ciphertext and the ciphertext generated using the parsable tokens match those of the selected encryptor.
When using the confirmation dialogue window:
The purpose of the confirmation dialogue window, i.e., the "Confirm ciphertext" window, is to detect typing mistakes made when entering the parsable tokens used to generate ciphertext. Using it is recommended when parsable tokens are typed directly into fields "Keyword", "Key", and "Plaintext", especially if any of them will be marked as private data, which is handled specially by Encryptor.
To confirm the parsable tokens used to generate ciphertext:
Click the Confirm Ciphertext button to open the confirmation dialogue window (not shown).
Enter "And Abram was fourscore and six years old, when Hagar bare Ishmael to Abram." in field "Keyword". Press the "Enter" key or tab to the next field. Encryptor reports the keyword matches the keyword of the selected encryptor (not shown).
Enter "Developer" in field "Key". Press the "Enter" key or tab to the next field. Encryptor reports the key matches the key of the selected encryptor (not shown).
Enter "password" in field "Plaintext". Press the "Enter" key or tab to the next field. Encryptor reports the plaintext matches the plaintext of the selected encryptor (not shown).
Encryptor immediately generates the ciphertext using the parsable tokens entered in the confirmation dialogue window and the same plaintext alphabet characteristics as the selected encryptor and reports that it matches the ciphertext of the selected encryptor (see Figure T03A - Using the confirmation dialogue window).
When creating an account or changing a password, most web service providers require the user to select a password, then confirm the password selected. Using the confirmation dialogue window conveniently allows you to copy and paste the ciphertext from the confirmation dialogue window (provided it matches the ciphertext of the selected encryptor) and then the main window into the "Password" and "Confirm password" text fields in use by a web service provider, and gain assurance that the password entered in the "Password" text field matches the password entered in the "Confirm password" text field before clicking "Submit".
This tutorial is based on tutorial: Encryptor - Tutorial (T02) - Generating a conforming password, and uses the same plaintext alphabet characteristics, complexity requirements, and parsable tokens.
Previously:
We have now created an Apple ID, and want to clear private data (see Encryptor - Features - Private data) to delete the keyword before we Save.
To clear private data:
Click the Clear Private Data button.
Encryptor deletes all parsable tokens marked as private data1,immediately generates the ciphertext resulting from the deletion (herein the "resulting ciphertext"), and reports that the resulting ciphertext satisfies the ciphertext complexity requirements. The resulting ciphertext is also a conforming password.
Endnotes.
This tutorial is based on tutorial: Encryptor - Tutorial (T02) - Generating a conforming password, and uses the same plaintext alphabet characteristics, complexity requirements, and parsable tokens.
Previously:
We have now created an Apple ID, and want to create a keychain item for this encryptor (see Encryptor - Features - Mac OS X Keychain integration).
To create a keychain item for this encryptor:
Click the Synchronize Keychain Item button.
The alert details the information that will be used to create the keychain item. Encryptor determines the scheme, server name, port, and path by parsing field "Domain" entered by the user as a URL (see Encryptor - Features - Mac OS X Keychain integration).
Review the information to ensure it is correct1 before clicking the Create Keychain Item button.
Click the Create Keychain Item button to create a keychain item.
Encryptor reports that it created a keychain item for this encryptor.
When the keychain item is created, the icon on the Synchronize Keychain Item button changes from an "Add" icon to a "Refresh" icon. The Synchronize Keychain Item button is disabled because the keychain item was just created and is therefore up-to-date, that is, the password for this encryptor matches the password for the keychain item. When the user makes a change which changes the ciphertext for this encryptor, for example a change to the plaintext alphabet characteristics or a parsable token, the Synchronize Keychain Item button is enabled. Clicking the Synchronize Keychain Item button will prompt the user to change the password of the keychain item.
Likewise, the Delete Keychain Item button is disabled when no keychain item for this encryptor exists, and enabled when a keychain item exists. Clicking the Delete Keychain Item button when a keychain item exists will prompt the user to delete the keychain item for the selected encryptor.
Confirm Keychain Access has an entry for this encryptor, and that is it correct.
Launch Keychain Access and confirm it has an entry for this encryptor. The information stored by Keychain Access should match the information which was used to create the keychain item.
The authentication details (i.e., the email address, domain, and password) used in this tutorial are for the purposes of example only, and were not used by Allen to register as an Apple developer. However, I have a valid Apple ID and have used versions of Encryptor to generate my passwords for several years.
The authentication details for my Apple ID and the corresponding keychain item differ from the authentication details used in our example. In addition to my personal Apple ID and password, when creating a keychain item I entered the specific URL in field "Domain" for which the keychain item will be requested when signing in: https://daw.apple.com.
Determining the correct URL is sometimes challenging, as the registration and log in links in use by some web service providers have no relationship to each other, and frequently change. It is so they may be changed at any time that the use of fields "Name" or "Domain" in a personal encryption algorithm is not recommended, unless you also want to require a change of password at this time.
After creating a keychain item for my current Apple ID, Safari prompts me to allow access to the keychain item I created when I sign in to Apple Developer. Click "Allow" or "Always Allow" (recommended) to allow Safari to access the keychain item.
Some popular Mac OS X applications do not natively support Mac OS X Keychain Services, for example, Firefox. See Encryptor - A note to Firefox users.
Endnotes.
Web service providers commonly implement password recovery options in the event a user forgets their password. The most common password recovery option is the use of challenge questions1 and answers. However, the use of challenge questions and answers provides little assurance the person providing the answer is, in fact, the user who created the account. By necessity, the web service provider must ask a question to which there is only one answer, and the answer must be memorable and factual. As a result, many web service providers ask the same questions.
These examples are taken directly from a list of challenge questions I have compiled over several years. Several web service providers asked each of the following questions:
Obviously, some of these questions are different ways of asking for the same information. For example, someone knowing the zip code of the address where you grew up likely knows the name of the city or town where you were born, and someone knowing what the name of your high school was likely knows what city it was in.
In many cases, the answers to these challenge questions can be determined by review of the user's Facebook page or LinkedIn profile, or indeed any of the many other sources on the Internet which hemorrhage the private details of our lives. As a result, the use of challenge questions provides little assurance that the person providing the answer is, in fact, the user who created the account.
Several strategies have been proposed to improve the security of challenge questions:
This has the advantage of not being discoverable by an adversary going through the same account creation process as the user. However, this requires the user to remember not only a password, but also the answer to a challenge question. If the question is suitably obscure, it may provide a measure of assurance. However, if the question is some variant of one of the many challenge questions in common use, it is probably less secure than the password which was forgotten.
This has the advantage of not being discoverable by review of the user's Facebook page or LinkedIn profile. However, this requires the user to remember the false information provided. Some users go so far as to create an alternate identity to conceal the private details of their lives, but as this identity is used more and more, it takes on a life of its own and itself becomes vulnerable to discovery.
This has the advantage of not requiring the user to remember anything. However, over the past several years it has become increasingly common for web service providers to associate an email address with an account. Attempting to create an account with the same email address causes the web service provider to attempt to authenticate the user by sending an email to the email account in question, with instructions on resetting the password, the success of which may rely on the user remembering the answers to their challenge questions.
This has the advantage that the user must be in possession of the device or email account in question. However, it requires the user to hemorrhage even more information, which may be undesirable if the user wants to retain as much privacy as possible.
For example, Google periodically interrupts the sign in process to remind me that I haven't provided a phone number for password recovery, which I would also be able to use for Google's "two-step verification" process. However, I do not need to provide a phone number to access Google's services, and I have no desire to provide a phone number to Google. I certainly have no desire to provide Google with my cell phone number, which is the most logical number to provide, since it is almost always in reach. I simply do not trust Google not to abuse access to my cell phone. Google has long been in the business of aggregating information for targeted advertising, and I have no desire to provide more than the absolute minimum information necessary to access Google's services. Google's recent declaration that Google+ is an "identity service" has validated my decision.
One of the design goals of Encryptor was: Encryptor will solve one of the most common problems with passwords, memorability, by allowing the user to use memorable parsable tokens to generate conforming passwords or other authentication tokens (see Encryptor - About - What makes Encryptor different from other password generators or managers?).
As a result, Encryptor may be used to generate the answers to challenge questions, ensuring the answer is unique to each web service provider.
For reasons which are discussed in detail below, our personal encryption algorithm for generating the answers to all challenge questions is:
This tutorial accompanies tutorial: Encryptor - Tutorial (T02) - Generating a conforming password.
Previously:
We now want to generate the answer to the challenge question: "What was the name of your first pet?"
Select "File > New Encryptor" (⇧⌘N) to create a new encryptor.
Enter the account name, domain, and a comment for this encryptor3. For this example, enter "Challenge question" in field "Comment".
Entering a comment such as "challenge" or "Challenge question" will make it possible to easily filter encryptors.
Press the "Enter" key or tab to the next field.
When a new encryptor is created, Encryptor will set the encryptor's preferences using the application preferences. However, because the answers to challenge questions will likely contain only upper and lower case characters and decimal digits, it is advantageous to change the encryptor's preferences so the plaintext alphabet includes only these characters. Click the Encryptor Preferences button to change the encryptor's preferences.
The answers to challenge questions will likely contain only upper and lower case characters and decimal digits.
The plaintext alphabet characteristics we will use are: "Use 7-bit character set", "Upper case characters", "Lower case characters", and "Decimal digits" (see Encryptor - About - Plaintext alphabet characteristics). We will delete the special character set.
Because we are not generating a conforming password we do not need to satisfy complexity requirements (see Encryptor - About - Complexity requirements). Ensure options "Use minimum length", "Use upper case characters", "Use lower case characters", "Use decimal digits", and "Use special characters" are not checked. These options are checked by default. Ensure option "Use maximum length" is not checked. This option is not checked by default.
Click the Save button (Encryptor Preferences).
The keyword is used to generate the unique, valid keyword, which is used to generate the ciphertext alphabet. If no keyword is provided, the tabula is based on the unmodified plaintext alphabet (see Encryptor - About - Parsable tokens).
It is to our advantage to use a tabula based on the unmodified plaintext alphabet because the tabula is the easiest to construct using pencil-and-paper methods (see Encryptor - About - What makes Encryptor different from other password generators or managers?). Also, when printed, a tabula based on the unmodified plaintext alphabet containing only upper and lower case characters and decimal digits is re-usable for multiple challenge questions, or indeed multiple account names and domains.
Do not enter a keyword. No keyword is needed.
Press the "Enter" key or tab to the next field.
Enter the key for this encryptor.
The personal encryption algorithm in use in this example uses the challenge question as the key.
Enter "What was the name of your first pet?" in field "Key". Click the Remember Key button to the right of field "Key" to mark it as private data. Because we are using the challenge question as the key, we do not need Encryptor to remember the key for us. When required by the web service provider, we enter the challenge question in field "Key".
Press the "Enter" key or tab to the next field.
Enter the plaintext for this encryptor.
Enter "Caesar O'Toole" in field "Plaintext". Press the "Enter" key or tab to the next field.
Encryptor immediately generates the ciphertext "iHEIWRGMVSYE". The ciphertext is the enciphered answer to the challenge question, and can be provided to the web service provider without disclosing the plaintext. If desired, with careful selection of parsable tokens the user can ensure the enciphered answer is unique for each account name and domain.
Click the Remember Plaintext button to the right of field "Plaintext" to mark it as private data. Because we are using the answer to the challenge question as the plaintext, and we know the answer, we do not need Encryptor to remember the plaintext for us. We can recover it at any time based on our personal encryption algorithm. Also, we may re-use this encryptor to generate the answers to other challenge questions for this account name and domain, or indeed multiple account names and domains.
Click the Use Keychain button to the right of field "Ciphertext" so that Encryptor will not report that the password for the keychain item corresponding to this account name and domain is not up-to-date. Although this isn't required, it is a good practice.
Encryptor warns us that the file contains private data. Click Cancel to cancel the Save and clear private data before saving.
Click the Clear Private Data button.
The key and plaintext are deleted. Because we have chosen the "Vigenère" cipher type, Encryptor cannot generate ciphertext without a key and the ciphertext is also deleted.
Encryptor does not warn us that the file contains private data because private data was deleted before saving (see Encryptor - Support - Features eligible for Allen's Reproducible Bug Bounty).
Endnotes.
This question was asked by RedPrairie Corporation and suggested by the College Foundation of North Carolina (CFNC), which allows the user to choose a challenge question and answer. CFNC also suggested "What is your mother's maiden name?", which is trivially determined by review of the user's Facebook page and provides little assurance that the person providing the answer is, in fact, the user who created the account.
This tutorial is based on tutorial: Encryptor - Tutorial (T02) - Generating a conforming password (herein "Tutorial T02"), and uses the same plaintext alphabet characteristics, cipher type, and parsable tokens.
The purpose of this tutorial is to demonstrate how to encrypt plaintext using pencil-and-paper methods to reproduce the ciphertext Encryptor generates. This tutorial is specific to cipher types "Vigenère", "Autokey", and "Running key", which use a tabula. Cipher type "Keyword substitution" does not use a tabula, although the method of encryption is similar (see Encryptor - Tutorial (T08) - Encrypting plaintext (Keyword substitution)).
Before discussing how Encryptor generates ciphertext, it is first necessary to establish some conventions, several of which are basic to cryptography in general. These conventions will be used throughout this tutorial:
One of the design goals of Encryptor was: Conforming passwords and other authentication tokens generated using Encryptor will be reproducible using pencil-and-paper methods (see Encryptor - About - What makes Encryptor different from other password generators or managers?).
Although the algorithms used to encrypt plaintext are well-known, the implementation for each cipher type is an extension of a more conventional implementation. For example:
Generally, in a more conventional implementation this was not a problem because the user of the pencil-and-paper method was trained in its use and understood that only the characters of the plaintext alphabet were valid. However, it is to our advantage that the potential search space is as large as the web service provider allows. Rather than require the user to carefully select parsable tokens containing only valid characters, Encryptor generates the intermediate variables unique, valid keyword, valid key, and valid plaintext (see Encryptor - About - Intermediate variables) by removing the invalid characters from the corresponding parsable token entered by the user.
To encrypt plaintext using pencil-and-paper methods to reproduce the ciphertext Encryptor generates:
The plaintext alphabet characteristics were established by Apple (see Encryptor - Tutorial (T02) - Generating a conforming password). Apple limits the plaintext alphabet to the the 7-bit characters in the ISO-8859-1 character set, and requires conforming passwords to contain upper and lower case characters and decimal digits, but no special characters. The plaintext alphabet resulting from these requirements contains the following 62 characters:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
To generate the ciphertext alphabet, we must first determine the unique, valid keyword (see Encryptor - About - Intermediate variables). When the user enters a keyword, Encryptor generates the unique, valid keyword and displays it in the text box to the right of field "Keyword".
The unique, valid keyword is generated by first extracting valid characters, then unique characters, from parsable token "keyword", in the order in which they occur in parsable token "keyword".
Based on the personal encryption algorithm in use in Tutorial T02, we entered the keyword "And Abram was fourscore and six years old, when Hagar bare Ishmael to Abram." in field "Keyword". Encryptor generated the unique, valid keyword:
AndbramwsfouceixylhHgIt
The ciphertext alphabet is generated by appending all characters of the plaintext alphabet not used by the unique, valid keyword to the unique, valid keyword in the order in which they occur in the plaintext alphabet (see Encryptor - About - Intermediate variables).
The ciphertext alphabet contains the following 62 characters:
AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz
The tabula is generated from the ciphertext alphabet. The first row of the tabula is identical to the ciphertext alphabet. Each succeeding row of the tabula is shifted one character to the left from the preceding row.
The tabula contains 62 rows:
AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz ndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzA dbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAn bramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAnd ramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndb amwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbr mwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbra wsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbram sfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramw fouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramws ouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsf uceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfo ceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfou eixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouc ixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouce xylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfoucei ylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceix lhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixy hHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixyl HgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylh gIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhH It0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHg t0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgI 0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt 123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0 23456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01 3456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012 456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123 56789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234 6789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345 789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456 89BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234567 9BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345678 BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789 CDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789B DEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BC EFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCD FGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDE GJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEF JKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFG KLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJ LMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJK MNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKL NOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLM OPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMN PQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNO QRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOP RSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQ STUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQR TUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRS UVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRST VWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTU WXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUV XYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVW YZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWX ZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXY jkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZ kpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZj pqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjk qvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkp vzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpq zAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqv
It may be helpful to Print (⌘P) the tabula for the encryptor created for Tutorial T02 before continuing.
To generate the ciphertext, we must first determine the valid key (see Encryptor - About - Intermediate variables). When the user enters a key, Encryptor generates the valid key and displays it in the text box to the right of field "Key".
The valid key is generated by extracting valid (but not necessarily unique) characters from parsable token "key", in the order in which they occur in parsable token "key".
Based on the personal encryption algorithm in use in Tutorial T02, we entered the key "Developer" in field "Key". Encryptor generated the valid key:
Developer
All characters are valid.
To generate the ciphertext, we must first determine the valid plaintext (see Encryptor - About - Intermediate variables). When the user enters the plaintext, Encryptor generates the valid plaintext and displays it in the text box to the right of field "Plaintext".
The valid plaintext is generated by extracting valid (but not necessarily unique) characters from parsable token "plaintext", in the order in which they occur in parsable token "plaintext".
Because the information stored by Encryptor alone cannot be used to re-create the ciphertext, we entered the arbitrary plaintext "password" in field "Plaintext". Encryptor generated the valid plaintext:
password
All characters are valid.
We now have all the information we need to encrypt the plaintext: the cipher type, plaintext alphabet, tabula, valid key, and valid plaintext.
The cipher type determines how Encryptor encrypts plaintext using the valid key (see Encryptor - About - Intermediate variables for a detailed discussion of Encryptor's behavior for all cipher types).
The cipher type selected for Tutorial T02 is "Vigenère". Because the length of the valid key is greater than or equal to the length of the valid plaintext4, the valid key is used to encrypt the valid plaintext using the tabula. Write the valid key above the valid plaintext, as follows:
Developer password
Encryptor encrypts each character of the valid plaintext using the row of the tabula corresponding to the key column character of the valid key, and so pairs of characters are used. For example, Encryptor encrypts the valid plaintext character "p" using the row of the tabula corresponding to key column character "D", the valid plaintext character "a" using the row of the tabula corresponding to key column character "e", and so on.
Each character of the ciphertext is therefore determined by locating the character at the intersection of column (for the valid plaintext) and row (for the valid key). The column is the column of the plaintext alphabet corresponding to the character of the valid plaintext in each pair. The row is the row of the tabula corresponding to the character of the valid key in each pair. The ciphertext character is determined by moving down the column and across the row. The ciphertext character is the character at their intersection. For example:
The column is the column of the plaintext alphabet corresponding to the first character of the valid plaintext ("password"): "p".
The row is the row of the tabula corresponding to the first character of the valid key ("Developer"): "D".
The ciphertext character is determined by moving down the column and across the row:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz ndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzA dbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAn bramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAnd ramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndb amwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbr mwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbra wsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbram sfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramw fouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramws ouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsf uceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfo ceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfou eixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouc ixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouce xylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfoucei ylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceix lhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixy hHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixyl HgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylh gIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhH It0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHg t0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgI 0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt 123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0 23456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01 3456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012 456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123 56789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234 6789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345 789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456 89BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234567 9BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345678 BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789 CDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789B DEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BC EFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCD FGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDE GJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEF JKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFG KLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJ LMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJK MNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKL NOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLM OPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMN PQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNO QRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOP RSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQ STUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQR TUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRS UVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRST VWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTU WXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUV XYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVW YZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWX ZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXY jkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZ kpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZj pqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjk qvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkp vzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpq zAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqv
The first character of the ciphertext is "1":
Developer password 1
The column is the column of the plaintext alphabet corresponding to the second character of the valid plaintext ("password"): "a".
The row is the row of the tabula corresponding to the second character of the valid key ("Developer"): "e".
The ciphertext character is determined by moving down the column and across the row:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz ndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzA dbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAn bramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAnd ramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndb amwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbr mwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbra wsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbram sfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramw fouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramws ouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsf uceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfo ceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfou eixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouc ixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouce xylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfoucei ylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceix lhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixy hHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixyl HgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylh gIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhH It0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHg t0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgI 0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt 123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0 23456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01 3456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012 456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123 56789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234 6789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345 789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456 89BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234567 9BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345678 BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789 CDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789B DEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BC EFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCD FGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDE GJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEF JKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFG KLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJ LMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJK MNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKL NOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLM OPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMN PQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNO QRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOP RSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQ STUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQR TUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRS UVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRST VWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTU WXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUV XYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVW YZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWX ZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXY jkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZ kpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZj pqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjk qvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkp vzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpq zAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqv
The second character of the ciphertext is "T":
Developer password 1T
The column is the column of the plaintext alphabet corresponding to the third character of the valid plaintext ("password"): "s".
The row is the row of the tabula corresponding to the third character of the valid key ("Developer"): "v".
The ciphertext character is determined by moving down the column and across the row:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz ndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzA dbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAn bramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAnd ramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndb amwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbr mwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbra wsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbram sfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramw fouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramws ouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsf uceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfo ceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfou eixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouc ixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouce xylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfoucei ylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceix lhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixy hHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixyl HgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylh gIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhH It0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHg t0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgI 0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt 123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0 23456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01 3456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012 456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123 56789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234 6789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345 789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456 89BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234567 9BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345678 BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789 CDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789B DEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BC EFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCD FGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDE GJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEF JKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFG KLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJ LMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJK MNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKL NOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLM OPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMN PQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNO QRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOP RSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQ STUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQR TUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRS UVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRST VWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTU WXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUV XYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVW YZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWX ZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXY jkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZ kpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZj pqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjk qvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkp vzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpq zAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqv
The third character of the ciphertext is "W":
Developer password 1TW
The column is the column of the plaintext alphabet corresponding to the fourth character of the valid plaintext ("password"): "s".
The row is the row of the tabula corresponding to the fourth character of the valid key ("Developer"): "e".
The ciphertext character is determined by moving down the column and across the row:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz ndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzA dbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAn bramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAnd ramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndb amwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbr mwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbra wsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbram sfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramw fouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramws ouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsf uceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfo ceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfou eixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouc ixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouce xylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfoucei ylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceix lhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixy hHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixyl HgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylh gIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhH It0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHg t0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgI 0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt 123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0 23456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01 3456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012 456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123 56789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234 6789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345 789BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456 89BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt01234567 9BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt012345678 BCDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789 CDEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789B DEFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BC EFGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCD FGJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDE GJKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEF JKLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFG KLMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJ LMNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJK MNOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKL NOPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLM OPQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMN PQRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNO QRSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOP RSTUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQ STUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQR TUVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRS UVWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRST VWXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTU WXYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUV XYZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVW YZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWX ZjkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXY jkpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZ kpqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZj pqvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjk qvzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkp vzAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpq zAndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqv
The fourth character of the ciphertext is "a":
Developer password 1TWa
This procedure continues until each character of the valid plaintext is encrypted. The resulting ciphertext is:
Developer password 1TWaevTW
Endnotes.
This tutorial is based on tutorial: Encryptor - Tutorial (T02) - Generating a conforming password (herein "Tutorial T02"), and uses the same plaintext alphabet characteristics and parsable tokens. The cipher type selected for Tutorial T02 is "Vigenère". However, for the purposes of this example, a cipher type of "Keyword substitution" is asserted.
The purpose of this tutorial is to demonstrate how to encrypt plaintext using pencil-and-paper methods to reproduce the ciphertext Encryptor generates. This tutorial is specific to cipher type "Keyword substitution".
One of the design goals of Encryptor was: Conforming passwords or other authentication tokens generated using Encryptor will be indistinguishable from random text (see Encryptor - About - What makes Encryptor different from other password generators or managers?). Keyword substitution is the weakest pencil-and-paper method implemented by Encryptor. Encryptor implements keyword substitution because:
As a result, careful selection of the keyword and plaintext are important when cipher type "Keyword substitution" is selected. However, because the plaintext alphabet characteristics are established by the web service provider, users should be aware that selecting cipher type "Keyword substitution" may not generate ciphertext which is indistinguishable from random text.
Also, if an insufficiently complex keyword is used, cipher type "Keyword substitution" is less likely to generate a conforming password because the ciphertext alphabet does not differ significantly from the plaintext alphabet. Append or prepend a token known only to you to the ciphertext generated by Encryptor to generate a conforming password (see Encryptor - Support - Tips and tricks).
Before discussing how Encryptor generates ciphertext, it is first necessary to establish some conventions which are basic to cryptography in general. These conventions will be used throughout this tutorial:
One of the design goals of Encryptor was: Conforming passwords and other authentication tokens generated using Encryptor will be reproducible using pencil-and-paper methods (see Encryptor - About - What makes Encryptor different from other password generators or managers?).
Although the algorithms used to encrypt plaintext are well-known, the implementation for each cipher type is an extension of a more conventional implementation. For example:
Generally, in a more conventional implementation this was not a problem because the user of the pencil-and-paper method was trained in its use and understood that only the characters of the plaintext alphabet were valid. However, it is to our advantage that the potential search space is as large as the web service provider allows. Rather than require the user to carefully select parsable tokens containing only valid characters, Encryptor generates the intermediate variables unique, valid keyword, valid key, and valid plaintext (see Encryptor - About - Intermediate variables) by removing the invalid characters from the corresponding parsable token entered by the user.
To encrypt plaintext using pencil-and-paper methods to reproduce the ciphertext Encryptor generates:
The plaintext alphabet characteristics were established by Apple (see Encryptor - Tutorial (T02) - Generating a conforming password). Apple limits the plaintext alphabet to the the 7-bit characters in the ISO-8859-1 character set, and requires conforming passwords to contain upper and lower case characters and decimal digits, but no special characters. The plaintext alphabet resulting from these requirements contains the following 62 characters:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
To generate the ciphertext alphabet, we must first determine the unique, valid keyword (see Encryptor - About - Intermediate variables). When the user enters a keyword, Encryptor generates the unique, valid keyword and displays it in the text box to the right of field "Keyword".
The unique, valid keyword is generated by first extracting valid characters, then unique characters, from parsable token "keyword", in the order in which they occur in parsable token "keyword".
Based on the personal encryption algorithm in use in Tutorial T02, we entered the keyword "And Abram was fourscore and six years old, when Hagar bare Ishmael to Abram." in field "Keyword". Encryptor generated the unique, valid keyword:
AndbramwsfouceixylhHgIt
The ciphertext alphabet is generated by appending all characters of the plaintext alphabet not used by the unique, valid keyword to the unique, valid keyword in the order in which they occur in the plaintext alphabet (see Encryptor - About - Intermediate variables).
The ciphertext alphabet contains the following 62 characters:
AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz
To generate the ciphertext, we must first determine the valid plaintext (see Encryptor - About - Intermediate variables). When the user enters the plaintext, Encryptor generates the valid plaintext and displays it in the text box to the right of field "Plaintext".
The valid plaintext is generated by extracting valid (but not necessarily unique) characters from parsable token "plaintext", in the order in which they occur in parsable token "plaintext".
Because the information stored by Encryptor alone cannot be used to re-create the ciphertext, we entered the arbitrary plaintext "password" in field "Plaintext". Encryptor generated the valid plaintext:
password
All characters are valid.
We now have all the information we need to encrypt the plaintext: the cipher type, plaintext alphabet, ciphertext alphabet, and valid plaintext.
The cipher type determines how Encryptor encrypts plaintext using the valid key. See Encryptor - About - Intermediate variables for a detailed discussion of Encryptor's behavior for all cipher types.
The cipher type selected for Tutorial T02 is "Vigenère". However, for the purposes of this example, a cipher type of "Keyword substitution" is asserted. Write the valid plaintext, as follows:
password
Encryptor encrypts each character of the valid plaintext using the corresponding character of the ciphertext alphabet. For example:
The plaintext character is the character of the plaintext alphabet corresponding to the first character of the valid plaintext ("password"): "p".
The ciphertext character is the corresponding character of the ciphertext alphabet:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz
The first character of the ciphertext is "V":
password V
The plaintext character is the character of the plaintext alphabet corresponding to the second character of the valid plaintext ("password"): "a".
The ciphertext character is the corresponding character of the ciphertext alphabet:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz
The second character of the ciphertext is "E":
password VE
The plaintext character is the character of the plaintext alphabet corresponding to the third character of the valid plaintext ("password"): "s".
The ciphertext character is the corresponding character of the ciphertext alphabet:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz
The third character of the ciphertext is "Y":
password VEY
The plaintext character is the character of the plaintext alphabet corresponding to the fourth character of the valid plaintext ("password"): "s".
The ciphertext character is the corresponding character of the ciphertext alphabet:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz AndbramwsfouceixylhHgIt0123456789BCDEFGJKLMNOPQRSTUVWXYZjkpqvz
The first character of the ciphertext is "Y":
password VEYY
This procedure continues until each character of the valid plaintext is encrypted. The resulting ciphertext is:
password VEYYpUXJ
This is not a conforming password. However, append or prepend a token known only to you to the ciphertext generated by Encryptor to generate a conforming password (see Encryptor - Support - Tips and tricks):
d0GVEYYpUXJ
Endnotes.
Because of Allen's focus on test-driven development, the testing of Encryptor has focused on formal validation using randomly-selected parsable tokens and manual testing of features such as Print, Export, and Save, Save As... and Quit.
For reproducibility by an independent third party, all validation was performed using desktop office software to generate pseudorandom numbers from known 'Random Seed' values (see Table II, below) using a "Uniform" distribution.
The initial approach involved the generation of numbers representing a possible combination of parameters from a population of all possible combinations of parameters:
Each test case was therefore represented by a single 23-digit binary number. The total number of possible combinations was 8,388,608. A later revision reduced the total number of possible combinations to 1,048,576 by reducing the number of digits assigned to parameters 'keyword', 'key', and 'plaintext' from five to four. A real number between 1 and the total number of possible combinations was generated. The number was rounded to the nearest integer value. This number was translated into binary. The digits of the number were then read from left to right, and used to generate the parameters for each test case: the first two digits represented parameter 'type', the second two represented parameter 'base', and so on.
This approach was rejected because the inclusion of some variable number of special characters and some variable number of duplicates did not reliably result in valid parameters. Many test cases failed to produce meaningful ciphertext. It was determined the population of all possible combinations of parameters includes many invalid combinations. For example, this approach resulted in five of every eight test cases automatically being invalid because only '100', '010', and '001' were valid values for parameter 'base'.
To resolve the problem, parameters were adjusted as necessary to produce meaningful ciphertext. However, no standard method reliably resulted in valid parameters. For example, converting letters to numbers in accordance with a known scheme (1337) sometimes resulted in valid parameters, but not in every test case, and converting some lower case characters into uppercase characters sometimes resulted in valid parameters, but not in every test case.
An approach which required the manipulation of randomly generated parameters was determined to be too subjective, and the generation of, and subsequent rejection of, large numbers of invalid combinations in search of those combinations which are valid was determined to be too time consuming. An approach which reduced the number of invalid combinations, while still providing reproducibility and reasonable assurance the utility functions as intended, was adopted.
For each combination of parameters selected:
The selected parameters and resulting intermediate variables were validated in accordance with the validation protocol, above, and produced the ciphertext reported in Table I, below. The ciphertext may be reproduced from the selected parameters in Table II, below, using the utility or by hand, with one exception: the output of the 'Validate' button has since been revised to report both parameter 'special' and unique special characters, in lieu of only unique special characters reported initially. Columns 'Validate' and 'Tabula' link to the output of the 'Validate' and 'Tabula Recta' buttons for each test case.
Overall, the results support the assertion that the utility works as intended. However, the total number of possible combinations for just one twelve-character parameter is 9512, which is a very large number, and it is therefore important to note that not all possible combinations can reasonably be tested.
Revisions affecting the results will be documented as necessary.
| Table I - Results | |||
|---|---|---|---|
| Test Case | ciphertext | Input | Tabula |
| 01 | xot | 01 | 01 |
| 02 | mHX1gM99 | 02 | 02 |
| 03 | gz+zn? | 03 | 03 |
| 04 | nk9 | 04 | 04 |
| 05 | chHFpaCKm | 05 | 05 |
| 06 | ct3g407 | 06 | 06 |
| 07 | zer4 | 07 | 07 |
| 08 | - none - | 08 | 08 |
| 09 | 4az,od4 | 09 | 09 |
| 10 | ag^c | 10 | 10 |
| 11 | z | 11 | 11 |
| 12 | g"7bmA-zR | 12 | 12 |
| Table II - Test Case Parameters | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Test Case | Parameter | Random Seed | Output | |||||||||||
| 01 | type | 0001 | 0 | |||||||||||
| 00 | ||||||||||||||
| base | 0002 | 1 | ||||||||||||
| 01 | ||||||||||||||
| set | 0003 | 0 | ||||||||||||
| 000 | ||||||||||||||
| special | 0104 | - none - | ||||||||||||
| keyword | 0105 | 2 | 65 | 85 | 18 | 31 | 90 | 22 | 58 | 22 | 23 | 67 | 95 | |
| ! | ` | t | 1 | > | y | 5 | Y | 5 | 6 | b | ~ | |||
| key | 0106 | 2 | 1 | 42 | 87 | 61 | 7 | 31 | 49 | 70 | 5 | 67 | 1 | |
| ! | I | v | \ | & | > | P | e | $ | b | |||||
| plaintext | 0107 | 2 | 32 | 93 | 62 | 90 | 18 | 40 | 41 | 23 | 82 | 66 | 1 | |
| ! | ? | | | ] | y | 1 | G | H | 6 | q | a | ||||
| 02 | type | 0001 | 2 | |||||||||||
| 10 | ||||||||||||||
| base | 0002 | 3 | ||||||||||||
| 11 | ||||||||||||||
| set | 0003 | 2 | ||||||||||||
| 010 | ||||||||||||||
| special | 0204 | 12 | 14 | 21 | 21 | |||||||||
| + | - | > | > | |||||||||||
| keyword | 0205 | 3 | 46 | 39 | 59 | 76 | 88 | 69 | 64 | 59 | 45 | 25 | 14 | |
| " | M | F | Z | k | w | d | _ | Z | L | 8 | - | |||
| key | 0206 | 3 | 77 | 91 | 34 | 12 | 5 | 78 | 56 | 12 | 28 | 24 | 14 | |
| " | l | z | A | + | $ | m | W | + | ; | 7 | - | |||
| plaintext | 0207 | 3 | 14 | 48 | 9 | 41 | 17 | 87 | 47 | 60 | 10 | 24 | 14 | |
| " | - | O | ( | H | 0 | v | N | [ | ) | 7 | - | |||
| 03 | type | 0001 | 1 | |||||||||||
| 01 | ||||||||||||||
| base | 0002 | 2 | ||||||||||||
| 10 | ||||||||||||||
| set | 0003 | 2 | ||||||||||||
| 010 | ||||||||||||||
| special | 0304 | 12 | 22 | 16 | 15 | |||||||||
| + | ? | / | . | |||||||||||
| keyword | 0305 | 4 | 27 | 88 | 6 | 27 | 86 | 22 | 70 | 2 | 68 | 76 | 26 | |
| # | : | w | % | : | u | 5 | e | ! | c | k | 9 | |||
| key | 0306 | 4 | 58 | 45 | 75 | 57 | 4 | 31 | 62 | 49 | 50 | 76 | 26 | |
| # | Y | L | j | X | # | > | ] | P | Q | k | 9 | |||
| plaintext | 0307 | 4 | 89 | 2 | 50 | 86 | 15 | 40 | 54 | 2 | 32 | 76 | 26 | |
| # | x | ! | Q | u | . | G | U | ! | ? | k | 9 | |||
| 04 | type | 0001 | 2 | |||||||||||
| 10 | ||||||||||||||
| base | 0002 | 2 | ||||||||||||
| 10 | ||||||||||||||
| set | 0003 | 2 | ||||||||||||
| 010 | ||||||||||||||
| special | 0404 | 12 | 20 | 21 | 20 | |||||||||
| + | = | > | = | |||||||||||
| keyword | 0405 | 5 | 9 | 43 | 47 | 72 | 85 | 69 | 77 | 38 | 90 | 34 | 39 | |
| $ | ( | J | N | g | t | d | l | E | y | A | F | |||
| key | 0406 | 5 | 40 | 94 | 22 | 8 | 2 | 78 | 68 | 86 | 72 | 34 | 39 | |
| $ | G | } | 5 | ' | ! | m | c | u | g | A | F | |||
| plaintext | 0407 | 5 | 70 | 51 | 91 | 37 | 13 | 87 | 60 | 39 | 55 | 33 | 39 | |
| $ | e | R | z | D | , | v | [ | F | V | @ | F | |||
| 05 | type | 0001 | 2 | |||||||||||
| 10 | ||||||||||||||
| base | 0002 | 3 | ||||||||||||
| 11 | ||||||||||||||
| set | 0003 | 2 | ||||||||||||
| 010 | ||||||||||||||
| special | 0504 | 13 | 18 | 16 | 14 | |||||||||
| , | ; | / | - | |||||||||||
| keyword | 0505 | 6 | 84 | 91 | 88 | 23 | 83 | 22 | 83 | 75 | 18 | 86 | 51 | |
| % | s | z | w | 6 | r | 5 | r | j | 1 | u | R | |||
| key | 0506 | 6 | 21 | 48 | 63 | 52 | 95 | 31 | 75 | 28 | 95 | 85 | 52 | |
| % | 4 | O | ^ | S | ~ | > | j | ; | ~ | t | S | |||
| plaintext | 0507 | 6 | 52 | 6 | 38 | 82 | 12 | 40 | 66 | 76 | 77 | 85 | 52 | |
| % | S | % | E | q | + | G | a | k | l | t | S | |||
| 06 | type | 0001 | 1 | |||||||||||
| 01 | ||||||||||||||
| base | 0002 | 2 | ||||||||||||
| 10 | ||||||||||||||
| set | 0003 | 5 | ||||||||||||
| 101 | ||||||||||||||
| special | 0604 | 2 | 5 | 10 | 7 | 24 | 27 | 32 | 29 | |||||
| ! | $ | ) | & | [ | ^ | } | ' | |||||||
| keyword | 0605 | 7 | 65 | 46 | 35 | 68 | 82 | 69 | 89 | 17 | 41 | 43 | 64 | |
| & | ` | M | B | c | q | d | x | 0 | H | J | _ | |||
| key | 0606 | 7 | 2 | 3 | 10 | 3 | 93 | 78 | 81 | 65 | 23 | 43 | 64 | |
| & | ! | " | ) | " | | | m | p | ` | 6 | J | _ | |||
| plaintext | 0607 | 7 | 33 | 54 | 79 | 33 | 10 | 87 | 72 | 18 | 5 | 42 | 64 | |
| & | @ | U | n | @ | ) | v | g | 1 | $ | I | _ | |||
| 07 | type | 0001 | 1 | |||||||||||
| 01 | ||||||||||||||
| base | 0002 | 2 | ||||||||||||
| 10 | ||||||||||||||
| set | 0003 | 4 | ||||||||||||
| 100 | ||||||||||||||
| special | 0704 | 2 | 3 | 5 | 2 | |||||||||
| ! | " | $ | ! | |||||||||||
| keyword | 0705 | 8 | 47 | 94 | 76 | 19 | 80 | 22 | 1 | 54 | 63 | 95 | 77 | |
| ' | N | } | k | 2 | o | 5 | U | ^ | ~ | l | ||||
| key | 0706 | 8 | 78 | 52 | 51 | 48 | 92 | 31 | 87 | 7 | 45 | 94 | 77 | |
| ' | m | S | R | O | { | > | v | & | L | } | l | |||
| plaintext | 0707 | 8 | 14 | 9 | 26 | 78 | 9 | 39 | 79 | 55 | 28 | 94 | 77 | |
| ' | - | ( | 9 | m | ( | F | n | V | ; | } | l | |||
| 08 | type | 0001 | 3 | |||||||||||
| 11 | ||||||||||||||
| base | 0002 | 3 | ||||||||||||
| 11 | ||||||||||||||
| set | 0003 | 5 | ||||||||||||
| 101 | ||||||||||||||
| special | 0804 | 2 | 11 | 11 | 6 | 24 | 33 | 33 | 28 | |||||
| ! | * | * | % | [ | ~ | ~ | _ | |||||||
| keyword | 0805 | 9 | 28 | 49 | 23 | 63 | 79 | 68 | 8 | 91 | 85 | 52 | 89 | |
| ( | ; | P | 6 | ^ | n | c | ' | z | t | S | x | |||
| key | 0806 | 9 | 59 | 6 | 92 | 93 | 90 | 77 | 93 | 44 | 68 | 52 | 89 | |
| ( | Z | % | { | | | y | l | | | K | c | S | x | |||
| plaintext | 0807 | 9 | 90 | 58 | 67 | 29 | 7 | 86 | 85 | 91 | 50 | 51 | 90 | |
| ( | y | Y | b | < | & | u | t | z | Q | R | y | |||
| 09 | type | 0001 | 2 | |||||||||||
| 10 | ||||||||||||||
| base | 0002 | 2 | ||||||||||||
| 10 | ||||||||||||||
| set | 0003 | 6 | ||||||||||||
| 110 | ||||||||||||||
| special | 0904 | 2 | 9 | 6 | 10 | 13 | 20 | 17 | 21 | |||||
| ! | ( | % | ) | , | = | : | > | |||||||
| keyword | 0905 | 10 | 9 | 4 | 63 | 14 | 77 | 21 | 14 | 33 | 14 | 10 | 8 | |
| ) | ( | # | ^ | - | l | 4 | - | @ | - | ) | ' | |||
| key | 0906 | 10 | 40 | 55 | 39 | 44 | 88 | 30 | 6 | 81 | 90 | 9 | 8 | |
| ) | G | V | F | K | w | = | % | p | y | ( | ' | |||
| plaintext | 0907 | 10 | 71 | 12 | 14 | 74 | 6 | 39 | 91 | 34 | 72 | 9 | 8 | |
| ) | f | + | - | i | % | F | z | A | g | ( | ' | |||
| 10 | type | 0001 | 2 | |||||||||||
| 10 | ||||||||||||||
| base | 0002 | 2 | ||||||||||||
| 10 | ||||||||||||||
| set | 0003 | 3 | ||||||||||||
| 011 | ||||||||||||||
| special | 1004 | 13 | 18 | 12 | 16 | 24 | 29 | 23 | 27 | |||||
| , | ; | + | / | [ | ` | @ | ^ | |||||||
| keyword | 1005 | 11 | 85 | 52 | 10 | 59 | 76 | 68 | 20 | 70 | 36 | 61 | 21 | |
| * | t | S | ) | Z | k | c | 3 | e | C | \ | 4 | |||
| key | 1006 | 11 | 22 | 9 | 79 | 89 | 87 | 77 | 12 | 23 | 18 | 61 | 21 | |
| * | 5 | ( | n | x | v | l | + | 6 | 1 | \ | 4 | |||
| plaintext | 1007 | 11 | 52 | 61 | 54 | 24 | 4 | 86 | 3 | 71 | 95 | 61 | 21 | |
| * | S | \ | U | 7 | # | u | " | f | ~ | \ | 4 | |||
| 11 | type | 0001 | 1 | |||||||||||
| 01 | ||||||||||||||
| base | 0002 | 1 | ||||||||||||
| 01 | ||||||||||||||
| set | 0003 | 1 | ||||||||||||
| 001 | ||||||||||||||
| special | 1104 | 24 | 27 | 28 | 31 | |||||||||
| [ | ^ | _ | | | |||||||||||
| keyword | 1105 | 11 | 66 | 7 | 51 | 10 | 74 | 21 | 27 | 12 | 58 | 19 | 33 | |
| * | a | & | R | ) | i | 4 | : | + | Y | 2 | @ | |||
| key | 1106 | 11 | 3 | 58 | 26 | 40 | 85 | 30 | 18 | 60 | 41 | 19 | 33 | |
| * | " | Y | 9 | G | t | = | 1 | [ | H | 2 | @ | |||
| plaintext | 1107 | 11 | 34 | 15 | 1 | 69 | 3 | 39 | 10 | 13 | 23 | 18 | 33 | |
| * | A | . | d | " | F | ) | , | 6 | 1 | @ | ||||
| 12 | type | 0001 | 3 | |||||||||||
| 11 | ||||||||||||||
| base | 0002 | 3 | ||||||||||||
| 11 | ||||||||||||||
| set | 0003 | 6 | ||||||||||||
| 110 | ||||||||||||||
| special | 1204 | 2 | 3 | 1 | 3 | 13 | 14 | 12 | 14 | |||||
| ! | " | " | , | - | + | - | ||||||||
| keyword | 1205 | 12 | 47 | 55 | 92 | 55 | 72 | 68 | 33 | 49 | 81 | 71 | 46 | |
| + | N | V | { | V | g | c | @ | P | p | f | M | |||
| key | 1206 | 12 | 78 | 13 | 67 | 85 | 84 | 77 | 24 | 2 | 63 | 70 | 46 | |
| + | m | , | b | t | s | l | 7 | ! | ^ | e | M | |||
| plaintext | 1207 | 12 | 15 | 64 | 42 | 20 | 1 | 86 | 16 | 50 | 45 | 70 | 46 | |
| + | . | _ | I | 3 | u | / | Q | L | e | M | ||||
| Table III - Type Parameters | |||
|---|---|---|---|
| X | |||
| 0 | 1 | ||
| Y | 0 | keyword | autokey |
| 1 | vigenere | runningkey | |
| Table IV - Base Parameters | |||
|---|---|---|---|
| X | |||
| 0 | 1 | ||
| Y | 0 | - not used - | 36 |
| 1 | 26 | 62 | |
| Table V - Special Character Sets | |
|---|---|
| Set: | Special characters: |
|
1 2 3 123456789012345678901234567890123 |
|
| ALL | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
| 1XX | !"#$%&'()* |
| X1X | +,-./:;<=>? |
| XX1 | @[\]^_`{|}~ |
| Table VI - Keyword, Key, and Plaintext Character Set |
|---|
|
1 2 3 4 5 6 7 8 9 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345 |
| !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ |
Validation of Encryptor's primary feature is described in the following document: Encryptor - Validation - Standard test cases.
The standard test cases described in Encryptor - Validation - Standard test cases are available as an XML document for download. Import (⌘I) this file into Encryptor to validate Encryptor in accordance with that document.
Please report import failures. File Import is a feature eligible for Allen's Reproducible Bug Bounty: "Later versions of Encryptor shall import encryptors exported by previous versions of Encryptor".

Test Case 01 - Tabula (Page 1)

Test Case 02 - Tabula (Page 1)

Test Case 02 - Tabula (Page 2)

Test Case 02 - Tabula (Page 3)

Test Case 02 - Tabula (Page 4)

Test Case 03 - Tabula (Page 1)

Test Case 03 - Tabula (Page 2)

Test Case 04 - Tabula (Page 1)

Test Case 04 - Tabula (Page 2)

Test Case 05 - Tabula (Page 1)

Test Case 05 - Tabula (Page 2)

Test Case 05 - Tabula (Page 3)

Test Case 05 - Tabula (Page 4)

Test Case 06 - Tabula (Page 1)

Test Case 06 - Tabula (Page 2)

Test Case 07 - Tabula (Page 1)

Test Case 07 - Tabula (Page 2)

Test Case 08 - Tabula (Page 1)

Test Case 08 - Tabula (Page 2)

Test Case 08 - Tabula (Page 3)

Test Case 08 - Tabula (Page 4)

Test Case 09 - Tabula (Page 1)

Test Case 09 - Tabula (Page 2)

Test Case 10 - Tabula (Page 1)

Test Case 10 - Tabula (Page 2)

Test Case 11 - Tabula (Page 1)

Test Case 12 - Tabula (Page 1)

Test Case 12 - Tabula (Page 2)

Test Case 12 - Tabula (Page 3)

Test Case 12 - Tabula (Page 4)
Because of Allen's focus on test-driven development, the testing of Encryptor has focused on formal validation using randomly-selected parsable tokens and manual testing of features such as Print, Export, and Save, Save As... and Quit.
This document describes validation of Encryptor's implementation of cipher type. The cipher type determines how Encryptor encrypts plaintext using the valid key (see Encryptor - About - Intermediate variables). This document does not describe formal validation of Encryptor using randomly-selected parsable tokens (see Encryptor - Validation - Standard test cases).
The standard test cases described in this document are available as an XML document for download (see Encryptor - Downloads - Cipher type implementation - Standard test cases). Import (⌘I) that document into Encryptor to validate Encryptor's cipher type implementation in accordance with this document.
It may be helpful to Print (⌘P) the tabula from the downloaded document before continuing. Because we are encrypting plaintext, the key-plaintext-ciphertext convention is used throughout this document (see Encryptor - Tutorial (T07) - How Encryptor encrypts plaintext).
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz bcdefghijklmnopqrstuvwxyza cdefghijklmnopqrstuvwxyzab defghijklmnopqrstuvwxyzabc efghijklmnopqrstuvwxyzabcd fghijklmnopqrstuvwxyzabcde ghijklmnopqrstuvwxyzabcdef hijklmnopqrstuvwxyzabcdefg ijklmnopqrstuvwxyzabcdefgh jklmnopqrstuvwxyzabcdefghi klmnopqrstuvwxyzabcdefghij lmnopqrstuvwxyzabcdefghijk mnopqrstuvwxyzabcdefghijkl nopqrstuvwxyzabcdefghijklm opqrstuvwxyzabcdefghijklmn pqrstuvwxyzabcdefghijklmno qrstuvwxyzabcdefghijklmnop rstuvwxyzabcdefghijklmnopq stuvwxyzabcdefghijklmnopqr tuvwxyzabcdefghijklmnopqrs uvwxyzabcdefghijklmnopqrst vwxyzabcdefghijklmnopqrstu wxyzabcdefghijklmnopqrstuv xyzabcdefghijklmnopqrstuvw yzabcdefghijklmnopqrstuvwx zabcdefghijklmnopqrstuvwxy
The length of the valid key is zero.
WARNING! For a Vigenère cipher, a key is required.
The length of the valid key is less than the length of the valid plaintext.
keykeykey password zeqcambh
The length of the valid key is greater than or equal to the length of the valid plaintext.
validkey password kadazyvb
The length of the valid key is greater than or equal to the length of the valid plaintext. This is effectively a running key cipher.
The length of the valid key is zero.
password password eakkscig
The length of the valid key is less than the length of the valid plaintext.
keypassword password zeqhwgjz
The length of the valid key is greater than or equal to the length of the valid plaintext.
validkey password kadazyvb
The length of the valid key is greater than or equal to the length of the valid plaintext. This is effectively a running key cipher.
The length of the valid key is less than the length of the valid plaintext.
WARNING! For a running key cipher, a valid key is required, and the length of the valid key must be greater than the length of the valid plaintext.
The length of the valid key ("key") is 3.
The length of the valid plaintext ("password") is 8.
The length of the valid key is greater than or equal to the length of the valid plaintext.
validkey password kadazyvb
Endnotes.
Validation of Encryptor's cipher type implementation is described in the following document: Encryptor - Validation - Cipher type implementation.
The standard test cases described in Encryptor - Validation - Cipher type implementation are available as an XML document for download. Import (⌘I) this file into Encryptor to validate Encryptor's cipher type implementation in accordance with that document.
Please report import failures. File Import is a feature eligible for Allen's Reproducible Bug Bounty: "Later versions of Encryptor shall import encryptors exported by previous versions of Encryptor".
This document describes validation of Encryptor's print behavior, in general, and describes a method by which users of Encryptor may quickly and easily validate a tabula printed across multiple vertically or horizontally-tiled pages. This document does not describe formal validation of Encryptor using randomly-selected parsable tokens (see Encryptor - Validation - Standard test cases).
Encryptor prints an outer border and inner offset border on each page as a visual guide for alignment when printing multiple vertically- or horizontally-tiled pages, and to serve as crop marks if the user wants to join printed pages to each other.
The outer border represents the printable area of the page. The width and height of the outer border are determined by the size of the printable area of the page, and are therefore the same on each printed page. Changing the paper size or printing to a different printer affects the size of the printable area of the page, and therefore the width and height of the outer border.
The inner offset border represents the portion of the printable area of the page in which the maximum number of columns or rows may be printed. The width and height of the inner offset border are determined by the maximum number of columns or rows which may be printed per page using the default line height of 1.5 and default font point size of 10 points, and are therefore the same on each printed page. Changing the paper size or printing to a different printer affects the size of the printable area of the page, and the maximum number of columns or rows which may be printed.
The position of the inner offset border is determined by the page's position across multiple vertically- or horizontally-tiled pages as either a top, middle, or bottom page, and either left, middle, or right page. With the exception of the middle pages in either dimension, the inner offset border is printed so that it is flush with the joining edge(s) of the paper. Because both the top and bottom edges of vertically-tiled middle pages are joining edges, only the left or right edges are significant, and the inner offset border is printed so that it is flush with either the left or right edge of the paper. Likewise, because both the left and right edges of horizontally-tiled middle pages are joining edges, only the top or bottom edges are significant, and the inner offset border is printed so that it is flush with either the top or bottom edge of the paper.
The standard test cases described in this document are available as an XML document for download (see Encryptor - Downloads - Printing - Standard test cases). Import (⌘I) that document into Encryptor to validate Encryptor's Print implementation in accordance with this document.
However, validation of Encryptor's print behavior is based on 38 columns per page by 48 rows calculated using the default line height of 1.5 and default font point size of 10 points, and the printable area of letter size paper when printing to a Samsung ML-1450. Changing the paper size or printing to a different printer affects the size of the printable area of the page, and the maximum number of columns or rows which may be printed.
When the phrase "Verify Encryptor centers..." (or a similar phrase) is used throughout this document: measurements are taken from the outer border to the tabula on all four sides. Corresponding measurements in one dimension (i.e., left outer border-tabula and tabula-right outer border or top outer border-tabula and tabula-bottom outer border) which are within 1/32 inch of each other are considered identical and the tabula considered centered in that dimension.
To make the best possible use of the standard test cases described in this article, test cases "02p" through "05po" were printed to PDF by Encryptor in both portrait and landscape mode, then to a Samsung ML-1450 as transparencies by Preview. These test cases allow me to confirm top, middle, and bottom, and left, middle, and right pages are printed correctly for cipher types other than "None". Printed output from Encryptor is validated using these transparencies as an overlay when changes which potentially affect the printing implementation are made.
Test cases "06pe" through "10po" were not printed to transparencies. These test cases were verified using the method described below:
I first draw a box on quad-ruled paper for each tiled page, in the position in which each page is printed. For example:
By default the number of characters in the alphabets is 95: 26 uppercase letters, 26 lowercase letters, ten (10) decimal digits, and 33 special characters. Based on 38 columns per page by 48 rows calculated using the default line height of 1.5 and default font point size of 10 points, and the printable area of letter size paper when printing to a Samsung ML-1450 in portrait mode, Encryptor prints two vertically-tiled pages and three horizontally-tiled pages, for a total of six pages.
I therefore draw six boxes, two rows of three boxes each.
In the upper left-hand corner of each box, I print the character in the upper left-hand corner of the tabula for that page, in the upper right-hand corner of each box, I print the character in the upper right-hand corner of the tabula for that page, and so on, until the characters in the corners of each page are recorded in the corners of the corresponding box for that page. Note that because Encryptor prints the plaintext alphabet above the tabula, the first row of the tabula is the row underneath the plaintext alphabet, and not the first row printed.
I match the characters on the right side of each box with the characters on the left side of the next box in that row, i.e., the box to the right. The character on the left side of the box to the right should be the next character in the ciphertext alphabet. Due to the symmetric nature of the tabula, the right side of the last box in each row will "wrap around" and match those on the left side of the first box in each row.
I match the characters on the bottom side of each box with the characters on the top side of the next box in that column, i.e., the box below. The character on the top side of the box below should be the next character in the ciphertext alphabet. Due to the symmetric nature of the tabula, the bottom side of the last box in each column will "wrap around" and match those on the top side of the first box in each column.
I match the characters in the upper right-hand corner of each box with the character in the lower-left corner of the box one row above and to the right. The character in the lower-left corner of the box one row above and to the right should be the next character in the ciphertext alphabet. Due to the symmetric nature of the tabula, the character in the upper-right corner of the first box in each column will "wrap around" on the top side and match the character in the lower-left corner of the last box in the column to the right and the character in the upper-right corner of the last box in each row will wrap around on the right side and match the character in the lower-left corner of the first box one row above.
If the characters on the right side match those on the left, the characters on the bottom side match those on the top, and the characters in the upper-right corner match those in the lower-left, the tabula is complete.
Validation of Encryptor's print behavior is described in the following document: Encryptor - Validation - Printing.
The standard test cases described in Encryptor - Validation - Printing are available as an XML document for download. Import (⌘I) this file into Encryptor to validate Encryptor's Print implementation in accordance with that document.
Please report import failures. File Import is a feature eligible for Allen's Reproducible Bug Bounty: "Later versions of Encryptor shall import encryptors exported by previous versions of Encryptor".