Imports CryptoSysAPI
' $Id: DemoMain.vb $
'****************************************************************************
' Copyright ©2007-9 DI Management Services Pty Limited, All Rights Reserved.
'****************************************************************************
' Distribution: You can freely use this code in your own applications, but
' you may not reproduce or publish this code on any web site, online service,
' or distribute as source on any media without express permission.
' Terms: Use at your own risk. Provided "as is" with no warranties.
' Contact: <www.di-mgt.com.au> <www.cryptosys.net>
'****************************************************************************
' This file last updated:
' $Date: 2009-03-19 16:31:00 $
'****************************************************************************
Module DemoMain
' Main code to do the basic tasks - everything else is just for show
Public Function SetNonceHex() As String
' Generate a random nonce the same size as the AES-128 block (128 bits)
Return Rng.NonceHex(Aes128.BlockSize)
End Function
Public Function EncryptWithPassword(ByVal strPassword As String, ByVal strSaltHex As String, ByVal nCount As Integer, ByVal strPlain As String) As String
' Encrypts `ordinary' text given password, etc. and returns hex-encoded ciphertext
Dim strKeyHex As String
Dim strInputHex As String
Dim strCipherHex As String
' 1. Form a 128-bit key from the password + salt + count
strKeyHex = Pbe.Kdf2(Aes128.BlockSize, strPassword, strSaltHex, nCount)
' 2. Encode the plaintext input in hex format
strInputHex = Cnv.ToHex(strPlain)
' 3. Pad the plaintext to an exact multiple of the encryption block size
strInputHex = Aes128.Pad(strInputHex)
' 4. Encrypt this padded input using the key and the IV
' (we use the same value for the IV as we used for the salt above)
strCipherHex = Aes128.Encrypt(strInputHex, strKeyHex, Mode.CBC, strSaltHex)
' Return the ciphertext in hex format
Return strCipherHex
End Function
Public Function DecryptWithPassword(ByVal strPassword As String, ByVal strSaltHex As String, ByVal nCount As Integer, ByVal strCipherHex As String) As String
' Decrypts strCipherHex. Returns plaintext as an `ordinary' text string.
' If fails, returns original hex-encoded ciphertext to indicate an error
' (this is because an empty string is a valid result).
Dim strKeyHex As String
Dim strPaddedHex As String
Dim strPlainHex As String
Dim strPlain As String
' 1. Form a 128-bit key from the password + salt + count
strKeyHex = Pbe.Kdf2(Aes128.BlockSize, strPassword, strSaltHex, nCount)
' 2. Decrypt the ciphertext to get padded plaintext (IV = salt)
strPaddedHex = Aes128.Decrypt(strCipherHex, strKeyHex, Mode.CBC, strSaltHex)
' 3. Check for error (i.e. an empty string)
If strPaddedHex.Length = 0 Then
Return strCipherHex
End If
' 4. Unpad to retrieve the plaintext
strPlainHex = Aes128.Unpad(strPaddedHex)
' 5. Check for error (this time strPlain *equal* to strPaddedHex)
If strPlainHex.Length = strPaddedHex.Length Then
Return strCipherHex
End If
' 6. Encode the hex-encoded text into normal text
strPlain = Cnv.StringFromHex(strPlainHex)
' Return the plaintext in hex format
Return strPlain
End Function
End Module