Cryptography Filer
SUMMARY
=======
The CFiler sample is a file encryptor that uses the Microsoft Cryptography
API (CAPI). Its interface is an adaptation of the FILER sample. CFiler
demonstrates a large part of the capabilities of CAPI, including encryption,
digital signature, and password-based key generation.
CFiler's interface contains two list boxes: the directory list box and the
file list box. Users navigate about their directory tree by double-clicking
on the directory list box, which is located on the left of CFiler's client
area. Double-clicking on an entry in the directory list box once causes the
directory to be expanded, with all its subdirectories displayed indented
below the entry. Double-clicking on the entry a second time causes the entry
to be collapsed. Users can perform cryptographic operations on files and
directories by selecting them in the file list box and selecting operations
from the menu. When a user double-clicks on an item in the file list box,
CFiler encrypts the file and displays its filename in gray text. Note: The
plaintext file is deleted. A second double-click causes CFiler to decrypt
the file and display its filename in its original color. Users sign files by
first selecting them in the file list box and then selecting Sign from the
File menu. Signed files appear in red text. Users can verify the signature
of a file by selecting the file in the file list box and choosing Verify from
the file menu. An encrypted file that has been signed appears in light red
text. When users encrypt and then sign files, they know that adversaries
have not encrypted the files. Users can select the algorithms they wish to
use for encryption and digital signature from the Options menu.
The first time a user runs CFiler, the application creates a key called fnKey
and stores the key in the registry. From then on, when the user starts
CFiler, the application access fnKey from the registry. CFiler uses fnKey to
encrypt file and directory names. When a user chooses to encrypt a file,
CFiler generates a session key with which to encrypt the file, exports the
key, generates a random filename with a .CRP extension, creates a hidden
file with this name, encrypts the name of the plaintext file with fnKey,
stores the encrypted filename to the .CRP file, stores the exported key to
the .CRP file, encrypts the data with the session key, stores the encrypted
content to the .CRP file, and deletes the plaintext file. When the user
chooses to encrypt a directory, CFiler encrypts the name of the directory
with fnKey, stores the data in a file called dirinfo in the directory,
generates a random name with a .CRP extension, renames the directory
using this name, hides the directory, encrypts all the files in the
directory, and recursively encrypts all subdirectories. If the fnKey is lost
or tampered with, CFiler displays the file in the file list box as RecoverMe
in gray text. Although the user can recover the original file, the original
filename is lost when fnKey is lost.
The Password item under the Options menu prompts the user for a password.
CFiler generates a session key with this password the next time the user
encrypts a file. When the user wishes to decrypt that file, the application
again prompts the user for the password.
CFiler never displays the random file and directory names it generates.
CFiler only displays the original names. CFiler accomplishes this by
maintaining two string tables: one for the directory list box and one for the
file list box. Each entry in the string table has a hidden and displayed
field. The hidden field holds the pathname as it appears on the disk. The
displayed field holds the pathname as it appeared on the disk before
encryption.
CFiler stores all signatures of files along with the ALG_ID's of the hashing
algorithms used to generate the signatures as separate, hidden files in the
hidden directory sig off the root on the same drive as the system directory.
This directory is hidden by default. Users may choose to hide or unhide this
directory and its contents. The filenames of these files are SHA hashes of
the full pathnames of the files. It is necessary to convert these 20-byte
hashes before using them as filenames since there are only 2^6 rather than
2^8 legal characters for filenames. By choosing 64 (2^6) characters for
filenames (A-Z, a-z, 0-9, +, and _), it is possible to convert 3 bytes of
the hash, containing 24 = 8 * 3 bits of data, to 4 bytes of the filename,
also containing 24 = 6 * 4 bits of data. CFiler adds 4 null bytes to the hash
to have 24 bytes with which to perform the conversion. CFiler knows that a
file has a signature if the hash of its full pathname is one of the files in
the sig directory. To increase efficiency, CFiler creates in memory a table
of the signature files when filling the file list box.
The default encryption algorithm is RC2, which is not fixed. For password-
based key generation, MD4 is the hashing algorithm, and it cannot be changed.
The default hashing algorithm for generating signature files (which the user
can change) is MD4. The algorithm used to generate fnKey is RC4. The
algorithm used to hash pathnames of files in order to generate signature
filenames is SHA, which is fixed. It is necessary to #define WIN95 when
compiling under Windows 95. Making CFiler a Unicode application simply
requires a #define UNICODE.
MORE INFORMATION
================
Encrypted files are structured in the following way:
1. Filename encrypted with fnKey (RC4). - 256 * sizeof(TCHAR) bytes.
2. Exported key blob length - sizeof(DWORD) bytes. This is zero if the user
selected a password-based key generation algorithm.
3. Key blob - (key blob length bytes) (0 bytes if generated from password).
4. Encrypted content.
Menus
-----
- File: Contains items which perform cryptographic operations on files.
- View: Contains items which change the view of the file and directory
list boxes.
- Drives: Contains a list of available drives.
- Options: Contains items which set options for the cryptography operations.
- Help: Contains information for the user to obtain help and version
information.
File Menu
---------
- Encrypt/Decrypt: If the selected file in the file list box is plaintext,
this menu item causes the application to encrypt the file. If the
selected item is encrypted, this menu item causes the application to
decrypt the file. During encryption, the plaintext file is deleted.
During decryption, the encrypted file is deleted.
- Sign: Creates a separate digital signature of the selected file in the
file list box. This file is stored in the directory sig off the root on
the same drive as the system directory. If a signature file already
exists, the application asks users if they want to delete the signature
file and replace it with a new signature file.
- Verify: Verifies the signature of the file selected in the file list box.
- Exit: Terminates the application.
View Menu
---------
- Refresh: Refreshes the view of the current drive to that of the root.
- Expand Tree: Recursively expands the directory tree in the directory
list box.
- Swap Sides: Swaps the file and directory list boxes.
Drives Menu
-----------
Lists available drives. When a user selects one of the items in this menu,
the application switches to that drive.
Options Menu
------------
- Choose Encryption Algorithm: Prompts the user with a dialog box with
radio buttons for each algorithm for generating session keys.
- Enter Password: Prompts the user with a dialog box with a field for a
password with which to generate session keys.
- Choose Signature Algorithm: Prompts the user with a dialog box containing
radio buttons for various algorithms with which to create digital
signatures.
- Hide Signatures (either checked or unchecked): Toggles the hidden or
shown status of the directory containing digital signatures as well as
the hidden or shown status of the signatures themselves.
Help Menu
---------
- CFiler Help: Loads the CFiler help file.
- About CFiler: Shows the CFiler version information.