[]
        
(Showing Draft Content)

Password Protecting Zip Files

While sending your sensitive zip files over the internet, it is essential to secure the data using advanced password protection. Protecting your zip file with passwords can keep intruders at bay from the confidential information you share across the wire. The C1Zip library provides the Password property in C1ZipFile class to add password to each entry in the zip file prior to adding the file to the zip archive. The library also provides the CheckPassword method of C1ZipEntry class.

In order to extract the entry in the zip file, the user can set the Password property to the same value that was used while adding the entry.

Enter password dialog box

Adding Password to Entry at Compression

For adding a password to an entry, you have to create a zip file using the Create method of C1ZipFile class. Then, assign a password to each entry to be added in the zip file using the Password property of C1ZipFile class, and add the entry to the zip archive by passing the Add method on the Entries property of C1ZipEntryCollection class.

WinForms

This is the C# Code for adding password to zip entry in WinForms applications:

private void btnCompress_Click(object sender, EventArgs e)
{
    // Create zip file
    zip.Create(@"C:\temp\txtfile.zip");
    // Get app dir
    string s = Application.ExecutablePath;
    s = s.Substring(0, s.IndexOf(@"\bin")) + @"\resources";
    // Populate zip file and list
    foreach (string f in Directory.GetFiles(s))
    {
        string FileName = f.ToLower();
        // Skip self
        if (FileName.EndsWith("zip")) continue; 
        listView1.Items.Add(Path.GetFileName(FileName)); 
        // Add password for each entry that is compressed
        zip.Password = "pass2808";
        // Add to zip file
        zip.Entries.Add(FileName); // add to zip file
    }
    // Update display.
    UpdateDisplay();
}
private void UpdateDisplay()
{
    // Remove any existing items.
    listView1.Items.Clear();
    // Add each entry.
    foreach (C1ZipEntry ze in zip.Entries)
    {
        // Calculate the compression amount.
        double pct = 0;
        if (ze.SizeUncompressed > 0)
        {
            pct = 1 - (((double)ze.SizeCompressed) / ((double)ze.SizeUncompressed));
        }
        // Build ListView item.
        ListViewItem lvi = new ListViewItem(new string[] { ze.FileName, Microsoft.VisualBasic.Strings.Format(ze.Date, "MM/dd/yy"), Microsoft.VisualBasic.Strings.Format(ze.SizeUncompressed, "#,##0"), Microsoft.VisualBasic.Strings.Format(ze.SizeCompressed, "#,##0"), Microsoft.VisualBasic.Strings.Format(pct, "00 %") });
        // Save ZipEntry into item tag.
        lvi.Tag = ze;
        // Add item to ListView.
        listView1.Items.Add(lvi);
    }
    // Update UI.
    bool hasEntries = (listView1.Items.Count > 0);
}

This is the VB Code for adding password to zip entry in WinForms applications:

Private Sub btnCompress_Click(sender As Object, e As EventArgs) Handles btnCompress.Click
    'Create Zip file
        zip.Create("C:\temp\txtfile.zip")
    Dim s As String = Application.ExecutablePath
    s = s.Substring(0, s.IndexOf("\bin")) & "\resources"
    For Each f As String In Directory.GetFiles(s)
        Dim FileName As String = f.ToLower()
        If FileName.EndsWith("zip") Then Continue For
        listView1.Items.Add(Path.GetFileName(FileName))
        zip.Password = "pass2808"
        'Add files
            zip.Entries.Add(FileName)
    Next
    ' Done.
        UpdateDisplay()
End Sub
Private Sub UpdateDisplay()
    ' Remove any existing items.
        listView1.Items.Clear()
    ' Add each entry.
        For Each ze As C1ZipEntry In zip.Entries
        Dim pct As Double = 0
        ' Calculate the compression amount.
            If ze.SizeUncompressed > 0 Then
            pct = 1 - ((CDbl(ze.SizeCompressed)) / (CDbl(ze.SizeUncompressed)))
        End If
        ' Build ListView item.
            Dim lvi As ListViewItem = New ListViewItem(New String() {ze.FileName, Microsoft.VisualBasic.Strings.Format(ze.Date, "MM/dd/yy"), Microsoft.VisualBasic.Strings.Format(ze.SizeUncompressed, "#,##0"), Microsoft.VisualBasic.Strings.Format(ze.SizeCompressed, "#,##0"), Microsoft.VisualBasic.Strings.Format(pct, "00 %")})
        ' Save ZipEntry into item tag.
            lvi.Tag = ze
        ' Add item to ListView.
            listView1.Items.Add(lvi)
    Next
    ' Update UI.
        Dim hasEntries As Boolean = (listView1.Items.Count > 0)
End Sub

WPF

This is the C# code for adding password to zip entry in WPF applications:

private void BtnCompress_Click(object sender, RoutedEventArgs e)
{
    // Create the C1ZipFile member.
           zip = new C1ZipFile();
    // Create zip file
           zip.Create(@"C:\temp\txtfile.zip");
    // Get app dir
           string s = System.Reflection.Assembly.GetExecutingAssembly().Location;
    s = s.Substring(0, s.IndexOf(@"\bin")) + @"\resources";
    // Populate zip file and list
           foreach (string f in Directory.GetFiles(s))
    {
        string FileName = f.ToLower();
        // Skip self
               if (FileName.EndsWith("zip")) continue;
        listView1.Items.Add(System.IO.Path.GetFileName(FileName));
        // Add password for each entry that is compressed
               zip.Entries.Add(FileName); // add to zip file
           }
    // Done.
           UpdateDisplay();
}
void UpdateDisplay()
{           
    var sel = listView1.SelectedItem;
    listView1.ItemsSource = null;
    if (zip == null)
    {
        return;
    }
    //_flex.ItemsSource = _zip.Entries;
           if (zip.Entries.Count == 0)
    {
        zip = null;
    }
    listView1.SelectedItem = sel;
}

This is the VB code for adding password to zip entry in WPF applications:

Private Sub BtnCompress_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    ' Create the C1ZipFile member.
    zip = New C1ZipFile()
    ' Create zip file
    zip.Create("C:\temp\txtfile.zip")
    ' Get app dir
    Dim s As String = Assembly.GetExecutingAssembly().Location
    s = s.Substring(0, s.IndexOf("\bin")) & "\resources"
    ' Populate zip file and list
    For Each f As String In Directory.GetFiles(s)
        Dim FileName As String = f.ToLower()
        ' Skip self
        If FileName.EndsWith("zip") Then Continue For
        Me.listView1.Items.Add(IO.Path.GetFileName(FileName))
        ' Add password for each entry that is compressed
        zip.Entries.Add(FileName) ' add to zip file
    Next
    ' Done.
    UpdateDisplay()
End Sub
Private Sub UpdateDisplay()
    Dim sel = Me.listView1.SelectedItem
    Me.listView1.ItemsSource = Nothing
    If zip Is Nothing Then
        Return
    End If
    '_flex.ItemsSource = _zip.Entries;
    If zip.Entries.Count = 0 Then
        zip = Nothing
    End If
    Me.listView1.SelectedItem = sel
End Sub

Further, you can validate the password while extracting each entry by initializing a UserInputDialog form to validate the password using the if-else statement.

WinForms

This is the C# Code for UserInputDialog form in WinForms applications:

public partial class UserInputDialog : Form
{        
    public UserInputDialog()
    {
        InitializeComponent();
    }
    // show dialog and return value to the user
    public string GetString(string caption)
    {
        return GetString(caption, string.Empty);
    }
    public string GetString(string caption, string defValue)
    {
        // initialize dialog
        Text = caption;
        _txtUser.Text = defValue;
        _txtUser.SelectAll();
        //Password masking for added security
        _txtUser.PasswordChar = '*';
        // show dialog
        var dr = ShowDialog();
        // return user input or null if user cancelled
        return dr == DialogResult.OK
            ? _txtUser.Text
            : null;
    }
}

This is the VB Code for UserInputDialog in WinForms applications:

Public Class UserInputDialog
    'Show dialog and return value to the user
    Public Function GetString(ByVal caption As String) As String
        Return GetString(caption, String.Empty)
    End Function
    Public Function GetString(ByVal caption As String, ByVal defValue As String) As String
        Text = caption
        _txtUser.Text = defValue
        _txtUser.SelectAll()
        Dim dr = ShowDialog()
        Return If(dr = DialogResult.OK, _txtUser.Text, Nothing)
    End Function
End Class

WPF

This is the C# code for UserInputDialog form in WPF applications:

public partial class UserInputDialog : Window
{
    public UserInputDialog()
    {
        InitializeComponent();
    }
    public string GetString(string caption)
    {
        return GetString(caption, string.Empty);
    }
    public string GetString(string caption, string defValue)
    {
        // initialize dialog
        Title = caption;
        _txtUser.Text = defValue;
        _txtUser.SelectAll();
        // show dialog

        Nullable<bool> dr = ShowDialog();
        // return user input or null if user cancelled
        return (dr == DialogResult.HasValue)
            ? _txtUser.Text
            : null;
    }
    private void BtnOK_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
    }
}

This is the VB code for UserInputDialog form in WPF applications:

Public Class UserInputdialog
    Public Function GetString(ByVal caption As String) As String
        Return GetString(caption, String.Empty)
    End Function
    Public Function GetString(ByVal caption As String, ByVal defValue As String) As String
        ' initialize dialog
        Title = caption
        Me._txtUser.Text = defValue
        Me._txtUser.SelectAll()
        ' show dialog
        Dim dr As Boolean? = ShowDialog()
        ' return user input or null if user cancelled
        Return If(dr = DialogResult.HasValue, Me._txtUser.Text, Nothing)
    End Function
    Private Sub BtnOK_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        DialogResult = True
    End Sub
End Class

Then, extract the selected entries by using the Extract method of C1ZipEntryCollection class.

WinForms

This is the C# Code for extracting entries in WinForms applications:

private void btnDecompress_Click(object sender, EventArgs e)
{
    // Make sure we have some selected entries.
    int cnt = listView1.SelectedIndices.Count;
    if (cnt == 0)
    {
        MessageBox.Show("Sorry, no files to extract...", "C1Zip");
        return;
    }
    // Confirm with user.
    DialogResult dr;
    string msg;
    msg = "Please confirm that you want to extract " + cnt.ToString() + " entries.";
    dr = MessageBox.Show(msg, "C1Zip", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (dr != DialogResult.OK) return;
    // Extract all selected entries.
    C1ZipEntry ze;
    foreach (ListViewItem lvi in listView1.SelectedItems)
    {
        ze = (C1ZipEntry)lvi.Tag;
        if (ze.SizeCompressed > 0)
        {
            // Validate password before extracting an entry
            var dlg = new UserInputDialog();
            dlg.Font = this.Font;
            string new_password = dlg.GetString("Enter password", zip.Password);
            if (new_password == "pass2808")
            {
                zip.Password = new_password;
                MessageBox.Show("Extracting your file...");
                zip.Entries.Extract(ze.FileName);
            }
            else
            {
                MessageBox.Show("The specified password is incorrect. Cannot extract the file.");
            }
        }
        // Done.
        UpdateDisplay();
    }

This is the VB Code for extracting entries in WinForms applications:

Private Sub btnDecompress_Click(sender As Object, e As EventArgs) Handles btnDecompress.Click
    ' Make sure we have some selected entries.
    Dim cnt As Integer = listView1.SelectedIndices.Count
    If cnt = 0 Then
        MessageBox.Show("Sorry, no files to extract...", "C1Zip")
        Return
    End If
    'Confirm with user.
    Dim dr As DialogResult
    Dim msg As String
    msg = "Please confirm that you want to extract " & cnt.ToString() & " entries."
    dr = MessageBox.Show(msg, "C1Zip", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
    If dr <> DialogResult.OK Then Return
    'Extract all selected entries.
    Dim ze As C1ZipEntry
    For Each lvi As ListViewItem In listView1.SelectedItems
        ze = CType(lvi.Tag, C1ZipEntry)
        If ze.SizeCompressed > 0 Then
            Dim dlg = New UserInputDialog()
            dlg.Font = Me.Font
            'Validate password before extracting an entry
            Dim new_password As String = dlg.GetString("Enter password", zip.Password)
            If new_password = "pass2808" Then
                zip.Password = new_password
                MessageBox.Show("Extracting your file...")
                zip.Entries.Extract(ze.FileName)
            Else
                MessageBox.Show("The specified password is incorrect. Cannot extract the file.")
            End If
        End If
        UpdateDisplay()
    Next
End Sub

WPF

This is the C# code for extracting entries in WPF applications:

private void BtnDecompress_Click(object sender, RoutedEventArgs e)
{
    //Make sure we have some selected entries.
    int cnt = listView1.SelectedItems.Count;
    if (cnt == 0)
    {
        MessageBox.Show("Sorry, no files to extract...", "C1Zip");
        return;
    }
    // Confirm with user.
    MessageBoxResult dr;
    string msg;
    msg = "Please confirm that you want to extract " + cnt.ToString() + " entries.";
    dr = MessageBox.Show(msg, "C1Zip", MessageBoxButton.OKCancel, MessageBoxImage.Question);
    if (dr != MessageBoxResult.OK) return;
    //Extract all selected entries.
    C1ZipEntry ze;
    foreach (string lvi in listView1.SelectedItems)
    {
        ze = (C1ZipEntry)zip.Entries[lvi];
        if (ze.SizeCompressed > 0)
        {
            // Validate password before extracting an entry
            var dlg = new UserInputDialog();
            string new_password = dlg.GetString("Enter password", zip.Password);
            if (new_password == "pass2808")
            {
                zip.Password = new_password;
                MessageBox.Show("Extracting your file...");
                zip.Entries.Extract(ze.FileName);
            }
            else
            {
                MessageBox.Show("The specified password is incorrect. Cannot extract the file.");
            }
        }
    }           
    // Done.
    UpdateDisplay();
}

This is the VB code for extracting entries in WPF applications:

Private Sub BtnDecompress_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    'Make sure we have some selected entries.
    Dim cnt As Integer = Me.listView1.SelectedItems.Count
    If cnt = 0 Then
        MessageBox.Show("Sorry, no files to extract...", "C1Zip")
        Return
    End If
    ' Confirm with user.
    Dim dr As MessageBoxResult
    Dim msg As String
    msg = "Please confirm that you want to extract " & cnt.ToString() & " entries."
    dr = MessageBox.Show(msg, "C1Zip", MessageBoxButton.OKCancel, MessageBoxImage.Question)
    If dr <> MessageBoxResult.OK Then Return
    'Extract all selected entries.
    Dim ze As C1ZipEntry
    For Each lvi As String In Me.listView1.SelectedItems
        ze = zip.Entries(lvi)
        If ze.SizeCompressed > 0 Then
            ' Validate password before extracting an entry
            Dim dlg = New UserInputdialog()
            Dim new_password As String = dlg.GetString("Enter password", zip.Password)
            If Equals(new_password, "pass2808") Then
                zip.Password = new_password
                MessageBox.Show("Extracting your file...")
                zip.Entries.Extract(ze.FileName)
            Else
                MessageBox.Show("The specified password is incorrect. Cannot extract the file.")
            End If
        End If
    Next
    ' Done.
    UpdateDisplay()
End Sub

See Also

Creating Zip Files with Multiple Entries

Walkthrough