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.
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.
This is the C# Code for adding password to zip entry in WinForms applications:
C# |
Copy Code
|
---|---|
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:
VB |
Copy Code
|
---|---|
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 |
This is the C# code for adding password to zip entry in WPF applications:
C# |
Copy Code
|
---|---|
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:
VB |
Copy Code
|
---|---|
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.
This is the C# Code for UserInputDialog form in WinForms applications:
C# |
Copy Code
|
---|---|
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:
VB |
Copy Code
|
---|---|
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
|
This is the C# code for UserInputDialog form in WPF applications:
C# |
Copy Code
|
---|---|
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:
VB |
Copy Code
|
---|---|
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.
This is the C# Code for extracting entries in WinForms applications:
C# |
Copy Code
|
---|---|
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:
VB |
Copy Code
|
---|---|
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 |
This is the C# code for extracting entries in WPF applications:
C# |
Copy Code
|
---|---|
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:
VB |
Copy Code
|
---|---|
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 |