<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-36896703</id><updated>2012-02-09T08:17:42.959+01:00</updated><title type='text'>Juan Carlos</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jcarlossaez.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jcarlossaez.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Juan Carlos</name><uri>http://www.blogger.com/profile/08356875516838829620</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36896703.post-116948749353486969</id><published>2007-01-22T18:34:00.002+01:00</published><updated>2011-03-04T17:08:36.480+01:00</updated><title type='text'>Backup and Restore tool for SQL Server with embedded compression and encryption</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Backup &amp;amp; Restore tool for SQL Server with embedded compression and encryption&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When I wrote &lt;a href="http://jcarlossaez1.wordpress.com/2005/10/21/four-cheap-ways-to-get-your-sql-server-backup-files-smaller/"&gt;Four cheap ways to get your SQL Server backup files smaller&lt;/a&gt; , I did it with SQL Server 7 and SQL Server 2000 in mind. Now, with SQL Server 2005 not supporting “Named Pipes” as target devices for backup/restore operations, only “three cheap ways to get SQL Server backup files smaller” would be available.&lt;br /&gt;&lt;br /&gt;While I was revising the content of the referred post, I found myself developing a simple tool to perform compression/decompression while backing up or restoring and also adding the capability to encrypt/decrypt the result.&lt;br /&gt;&lt;br /&gt;Finally, I got a tool I called ZipVDI with a short “readme.txt” file you can read bellow. ZipVDI is a very simple tool, not comparable to all those commercial tools making a good job in this area. All of them have a lot of interesting features, but there is an interesting one I am not able to find in those commercial tools: ZipVDI compression and encryption format is publicly available. Compression is done with gzip library and sample code showing how ZipVDI derives keys, IV, encrypts and decrypts is attached.&lt;br /&gt;This means that any other tool (commercial or not) would be able to use or generate files in the “ZipVDI” format.&lt;br /&gt;&lt;br /&gt;Why is this feature an important one? Let’s see: haven’t you see cases where different sites of the same company are not able to share SQL Server backups generated by these tools because they are using different tools in each site? Of course, this situation is much more common when the involved sites belong to different companies.&lt;br /&gt;Of course, “ZipVDI” is not relevant enough to make others tools be aware of its file format, but if these commercial tools were able to interact each other, your company, your site or even your department would buy their favorite tool to use as widely as possible in its internal scope while still being able to directly interchange backup files with “others”.&lt;br /&gt;Isn’t this the situation with commercial/free file compressors? When you buy a copy of WinZip, you expect to decompress almost any compressed file no matter the compression format.&lt;br /&gt;&lt;br /&gt;If after reading the previous comment and the content of the “Readme.txt” file for ZipVDI tool, you still want to play with it, download a binary copy from&lt;br /&gt;&lt;a href="http://cid-b3378f057444b65c.skydrive.live.com/self.aspx/P%c3%bablico/ZipVDI/zipvdi%7C_1.2.00.zip"&gt;download ZipVDI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;strong&gt;Readme.txt&lt;br /&gt;License Agreement For ZipVDI&lt;br /&gt;------------------------------&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This program can be used to backup/restore SQL Server databases&lt;br /&gt;to/from compressed and encrypted files.&lt;br /&gt;If you encrypt a file with this program, and then forget your&lt;br /&gt;password, there is no way you can get the file back&lt;br /&gt;- and it is NOT MY FAULT!&lt;br /&gt;&lt;br /&gt;If the program crashes whilst encrypting/decrypting and you&lt;br /&gt;lose valuable data, then I apologise, but I am not to be&lt;br /&gt;held responsible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Limited Warranty:&lt;br /&gt;-----------------&lt;/strong&gt;&lt;br /&gt;THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED&lt;br /&gt;WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;br /&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT&lt;br /&gt;OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES&lt;br /&gt;(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE&lt;br /&gt;GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR&lt;br /&gt;BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY&lt;br /&gt;OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR&lt;br /&gt;TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY&lt;br /&gt;WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF&lt;br /&gt;THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Frequently Asked Questions&lt;br /&gt;=============================&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;- What is ZipVDI?&lt;br /&gt;- What is the compression algorithm used by ZipVDI?&lt;br /&gt;- What are the encryption algorithms used by ZipVDI?&lt;br /&gt;- What command line arguments can be used with ZipVDI?&lt;br /&gt;- Is there deeper explanation for command line arguments?&lt;br /&gt;- How do I convert a backup file generated with ZipVDI&lt;br /&gt;to a regular SQL Server backup file?&lt;br /&gt;- How do I convert a regular SQL Server backup file to&lt;br /&gt;a file format readable by ZipVDI?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- What is ZipVDI?&lt;br /&gt;===================&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ZipVDI is a small console application that allows you to&lt;br /&gt;&lt;strong&gt;execute backup/restore operations directly TO/FROM&lt;br /&gt;compressed and encrypted files&lt;/strong&gt;.&lt;br /&gt;Compression and encryption is done while the&lt;br /&gt;backup/restore operation takes place, that is, they are&lt;br /&gt;executed in memory without needing intermediate files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- What is the compression algorithm used by ZipVDI?&lt;br /&gt;===================================================&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ZipVDI uses the &lt;strong&gt;zlib library&lt;/strong&gt; to compress/decompress&lt;br /&gt;the backup information.&lt;br /&gt;Compression level ranges from 0 (no compression) to 9&lt;br /&gt;(max compression), obviously inherited from the zlib&lt;br /&gt;library&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- What are the encryption algorithms used by ZipVDI?&lt;br /&gt;====================================================&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ZipVDI can encrypt/decrypt the backup information using:&lt;br /&gt;&lt;br /&gt;- &lt;strong&gt;AES (rijndael)&lt;/strong&gt; with a 256 bits Key and 128 bits IV&lt;br /&gt;- &lt;strong&gt;Triple DES&lt;/strong&gt; with 168 bits key and 128 bits IV&lt;br /&gt;&lt;br /&gt;Key and IV are derived from a user &lt;strong&gt;pass phrase&lt;/strong&gt; provided as&lt;br /&gt;a command line argument.&lt;br /&gt;&lt;br /&gt;However, due to Windows Crypto API provider limitations,&lt;br /&gt;AES encryption can only be used on Windows 2003 and later&lt;br /&gt;(Triple DES can be used in any of the currently supported&lt;br /&gt;Windows versions)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- What command line arguments can be used with ZipVDI?&lt;br /&gt;======================================================&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ZipVDI uses getopts Command line argument parser from&lt;br /&gt;Steve Mertz &lt;steve@dragon-ware.com&gt;Its copyright notice&lt;br /&gt;should be present among all the documentation of this tool.&lt;br /&gt;&lt;br /&gt;By typing ZipVDI -h at the command prompt, a list of&lt;br /&gt;available options and a short explanation is showed.&lt;br /&gt;&lt;br /&gt;Usage: zipvdi [options]&lt;br /&gt;&lt;br /&gt;--help, -h Displays this information&lt;br /&gt;--instance, -i &lt;args&gt;SQL Server instance name&lt;br /&gt;default instance if omitted)&lt;br /&gt;--sentence, -s &lt;args&gt;SQL backup/restore sentence&lt;br /&gt;use " to enclose the sentence)&lt;br /&gt;--compress, -c &lt;args&gt;Compression level (if omitted set&lt;br /&gt;to 6)&lt;br /&gt;--password, -p &lt;args&gt;Pass phrase to encrypt/decrypt&lt;br /&gt;use " to enclose the pass phrase).&lt;br /&gt;If -p is present and pass phrase&lt;br /&gt;is empty (you typed -p ""),&lt;br /&gt;the program will prompt for it.&lt;br /&gt;If -p is no present, no encryption&lt;br /&gt;takes place.&lt;br /&gt;--algorithm,-a &lt;args&gt;Algorithm to encrypt: a(aes) d(3des)&lt;br /&gt;(default algorithm is AES)&lt;br /&gt;--logfile, -l &lt;args&gt;File to store log information&lt;br /&gt;&lt;br /&gt;Some samples:&lt;br /&gt;&lt;br /&gt;* Backup pubs database to c:\pubs.bkp with the default&lt;br /&gt;compression level and encrypting using AES with a&lt;br /&gt;pass phrase&lt;br /&gt;&lt;br /&gt;(next three lines are a single command)&lt;br /&gt;&lt;em&gt;zipvdi -s "backup database pubs to disk='c:\pubs.bkp'&lt;br /&gt;with stats=1" -p "unbreakable pass phrase" -a a&lt;br /&gt;-l "c:\pubs.bkp.log"&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;* Restore pubs_new database using the previous backup&lt;br /&gt;and decrypting using AES with a pass phrase&lt;br /&gt;&lt;br /&gt;(next five lines are a single command)&lt;br /&gt;&lt;em&gt;zipvdi -s "restore database pubs_new from disk = 'c:\pubs.bkp'&lt;br /&gt;with move N'pubs' to N'c:\mssql\data\pubs_new.mdf',&lt;br /&gt;move N'pubs_log' to N'c:\mssql\data\pubs_new_log.ldf',&lt;br /&gt;replace, stats = 10" -p "unbreakable pass phrase"&lt;br /&gt;-a a -l "c:\pubs_new.res.log"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Is there deeper explanation for command line arguments?&lt;br /&gt;=========================================================&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Here, you can find deeper explanation for some command&lt;br /&gt;line arguments&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;--instance, -i &lt;args&gt;&lt;br /&gt;--------------------------&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;When several SQL Server instances are running on the same&lt;br /&gt;machine, use this argument to select which one is the&lt;br /&gt;target instance for the backup/restore operation.&lt;br /&gt;&lt;br /&gt;For example, if in addition to your default SQL Server&lt;br /&gt;instance, you have a second instance named MySecondSQL,&lt;br /&gt;you should execute the following command to backup the&lt;br /&gt;pubs database hosted in the second instance&lt;br /&gt;&lt;br /&gt;(next three lines are a single command)&lt;br /&gt;&lt;em&gt;zipvdi -i ServerName\MySecondSQL -s "backup database pubs&lt;br /&gt;to disk='c:\pubs2.bkp'" -p "unbreakable pass phrase"&lt;br /&gt;-a a -l "c:\pubs2.bkp.log"&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;--sentence, -s &lt;args&gt;&lt;br /&gt;-------------------------&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;This is the SQL sentence that performs the backup/restore&lt;br /&gt;operation. Use double quotation marks to enclose the&lt;br /&gt;sentence.&lt;br /&gt;&lt;br /&gt;The same syntax supported by SQL Server should be used&lt;br /&gt;with ZipVDI (you can use options such as CHECKSUM,&lt;br /&gt;VERIFYONLY,...)with some restrictions:&lt;br /&gt;&lt;br /&gt;- Only one backup/restore device can be specified.&lt;br /&gt;Backing up/Restoring TO/FROM multiple devices&lt;br /&gt;are not currently supported.&lt;br /&gt;&lt;br /&gt;- Only disk can be specified as backup device&lt;br /&gt;(TO DISK='xxx'/FROM DISK='xxx').&lt;br /&gt;However, you can specify a named pipe or the&lt;br /&gt;stdin/stdout as the file name used for the&lt;br /&gt;backup/restore operation.&lt;br /&gt;&lt;br /&gt;Example 1: backup pubs database to the named pipe&lt;br /&gt;'\\.\pipe\PUBS_PIPE'&lt;br /&gt;This possibility is very useful if you&lt;br /&gt;want to send the output of this&lt;br /&gt;program to the input of other tool&lt;br /&gt;(like a different encryptor).&lt;br /&gt;Note that in the example bellow,&lt;br /&gt;no encryption takes place&lt;br /&gt;&lt;br /&gt;(next three lines are a single command)&lt;br /&gt;&lt;em&gt;zipvdi -s "backup database pubs to&lt;br /&gt;disk='\\.\pipe\PUBS_PIPE'"&lt;br /&gt;-l "c:\pubs.bkp.log"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Example 2: backup pubs database to the stdout.&lt;br /&gt;stdout is selected by choosing '-'&lt;br /&gt;as the file name.&lt;br /&gt;stdin can also be selected for restore operations&lt;br /&gt;&lt;br /&gt;(next three lines are a single command)&lt;br /&gt;&lt;em&gt;zipvdi -s "backup database pubs to disk='-'"&lt;br /&gt;-p "unbreakable pass phrase" -a a&lt;br /&gt;-l "c:\pubs.bkp.log"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;--compress, -c &lt;args&gt;&lt;br /&gt;-------------------------&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This parameter defines the compression level that will be&lt;br /&gt;used by zlib when compressing the backup content.&lt;br /&gt;Valid values are from 0 (no compression) to 9 (max&lt;br /&gt;compression). If not values is provided,&lt;br /&gt;the default compression level of 6 will be used.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;--algorithm, -a &lt;args&gt;&lt;br /&gt;--------------------------&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This parameter defines which encryption/decryption will&lt;br /&gt;be used. Backups can be encrypted with AES (a) or triple&lt;br /&gt;DES (d). However, due to restrictions in the Windows Crypto&lt;br /&gt;API system, AES encryption is only supported in&lt;br /&gt;Windows 2003 or later.&lt;br /&gt;Thus, if you want to share encrypted backups between&lt;br /&gt;different Operating system, you should check all of them&lt;br /&gt;support the selected encryption algorithm.&lt;br /&gt;&lt;br /&gt;If this parameter is not present, then no&lt;br /&gt;encryption/decryption is executed and the backup content&lt;br /&gt;is only compressed/decompressed during the backup/restore&lt;br /&gt;operation&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;--password, -p &lt;args&gt;&lt;br /&gt;-------------------------&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Use this parameter to provide the pass phrase used to&lt;br /&gt;derive the Key and the IV to be used with the encryption&lt;br /&gt;algorithm.&lt;br /&gt;Use double quotation marks to enclose pass phrase made of&lt;br /&gt;more than one word.&lt;br /&gt;If -p option is present but no pass phrase is entered&lt;br /&gt;(you specify -p ""), then the program will ask for the pass&lt;br /&gt;phrase before starting the operation.&lt;br /&gt;This option is useful if you don't want to have the pass&lt;br /&gt;phrase in your batch files, but requires you enter manually&lt;br /&gt;the pass phrase at execution time&lt;br /&gt;&lt;br /&gt;If the selected algorithm is AES, then the derived key will&lt;br /&gt;have a length of 256 bits.&lt;br /&gt;If the selected algorithm is 3 DES, then the derived key&lt;br /&gt;will have a length of 168 bits.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;--logfile, -l &lt;args&gt;&lt;br /&gt;-------------------------&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Use this optional parameter to define a log file where&lt;br /&gt;ZipVDI will store information about the operation: which&lt;br /&gt;task is executed, target file, compression ratio, and any&lt;br /&gt;message returned by the SQL Server during the&lt;br /&gt;backup/restore operation (for example, if you specify the&lt;br /&gt;clause "WITH STATS=10", the progress information will be&lt;br /&gt;logged to this file).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- How do I convert a backup file generated with ZipVDI to&lt;br /&gt;a regular SQL Server backup file?&lt;br /&gt;==========================================================&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;ZipVDI backup operation is quite simple: the information&lt;br /&gt;returned by the SQL Server as backup content is first&lt;br /&gt;compressed using the zlib library and then it is encrypted&lt;br /&gt;using either AES or Triple DES (if any of these algorithms&lt;br /&gt;was selected).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+------------+ VDI +----------+ +---------+ +-------+&lt;br /&gt;SQL Server -&gt; Compress -&gt; Encrypt -&gt; Write&lt;br /&gt;+------------+ +----------+ +---------+ +-------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thus, to convert the file generated by ZipVDI as the result&lt;br /&gt;of a backup operation, you only need to revert both&lt;br /&gt;operations:&lt;br /&gt;&lt;br /&gt;- First you have to decrypt the file.&lt;br /&gt;- then, you have to decompress the decrypted file&lt;br /&gt;&lt;br /&gt;and you will get a backup file in the native SQL Server&lt;br /&gt;backup file format.&lt;br /&gt;&lt;br /&gt;To decrypt the ZipVDI generated file, you can use the&lt;br /&gt;accompanying tool called DecryptBackup.&lt;br /&gt;Also, the source code for this tool is provided.&lt;br /&gt;&lt;br /&gt;To decompress the file obtained after decrypting,&lt;br /&gt;you can use the gzip tool available at&lt;br /&gt;www.gzip.org site.&lt;br /&gt;&lt;br /&gt;These two steps could be done with one single tool (even&lt;br /&gt;this functionality could be part of the ZipVDI tool).&lt;br /&gt;The reason to create the tool DecryptBackup and opening&lt;br /&gt;its code is to transparently show how ZipVDI encrypts.&lt;br /&gt;ZipVDI is performing standard compression using a&lt;br /&gt;"well know" compression algorithm and also is performing&lt;br /&gt;standard encryption (using also "well know" encryption&lt;br /&gt;algorithms) offering you the possibility to revert the&lt;br /&gt;encryption by yourself since you can see the code to&lt;br /&gt;encrypt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- How do I convert a regular SQL Server backup file to a&lt;br /&gt;file format readable by ZipVDI?&lt;br /&gt;=========================================================&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ZipVDI backup operation is quite simple: the information&lt;br /&gt;returned by the SQL Server as backup content is first&lt;br /&gt;compressed using the zlib library and then it is encrypted&lt;br /&gt;using either AES or Triple DES (if any of these algorithms&lt;br /&gt;was selected).&lt;br /&gt;Thus, to convert a backup file generated by SQL Server to&lt;br /&gt;a file that can be read by ZipVDI (and used to perform&lt;br /&gt;restore operations) you only need to execute both&lt;br /&gt;operations:&lt;br /&gt;&lt;br /&gt;- First you have to compress the original backup&lt;br /&gt;file using gzip tool.&lt;br /&gt;- Then, you may encrypt the compressed file using&lt;br /&gt;the accompanying tool called EncryptBackup.&lt;br /&gt;&lt;br /&gt;And as explained in the previous question, these two steps&lt;br /&gt;could be done with one single tool.&lt;br /&gt;The reason to create the tool DecryptBackup and opening&lt;br /&gt;its code is to transparently show how ZipVDI encrypts.&lt;br /&gt;ZipVDI is performing standard compression using a&lt;br /&gt;"well know" compression algorithm and also is performing&lt;br /&gt;standard encryption (using also "well know" encryption&lt;br /&gt;algorithms) offering you the possibility to revert the&lt;br /&gt;encryption by yourself since you can see the code to&lt;br /&gt;encrypt.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36896703-116948749353486969?l=jcarlossaez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcarlossaez.blogspot.com/feeds/116948749353486969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36896703&amp;postID=116948749353486969' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116948749353486969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116948749353486969'/><link rel='alternate' type='text/html' href='http://jcarlossaez.blogspot.com/2007/01/backup-and-restore-tool-for-sql-server.html' title='Backup and Restore tool for SQL Server with embedded compression and encryption'/><author><name>Juan Carlos</name><uri>http://www.blogger.com/profile/08356875516838829620</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36896703.post-116282977997040861</id><published>2006-11-06T17:09:00.000+01:00</published><updated>2006-11-07T11:33:03.413+01:00</updated><title type='text'>A compressed and encrypted User Defined Type (UDT) for SQL Server 2005</title><content type='html'>&lt;p&gt;Compression and encryption: you may like or hate them, but they have been (and will be) there for a long time.&lt;br /&gt;&lt;br /&gt;In fact, there are so many resources devoted to compression and encryption that is difficult to believe anyone could have a requirement and nobody has already developed a solution for that requirement.&lt;br /&gt;&lt;br /&gt;Well, this is not totally true. For example, related to compression, time ago I had to develop a tool to perform on-the-fly compression/decompression for the output/input of windows programs (something similar to Unix tool mknod, but as a native Windows application, not emulated with Cygwin or similar).&lt;br /&gt;&lt;br /&gt;Now, although the built-in support for Encryption in SQL Server 2005 seems to be enough to solve almost any encryption requirement at database level, I miss one feature: a native encrypted text data type that could be used as any other native data type in table definition.&lt;br /&gt;&lt;br /&gt;I won’t discuss here whether it is necessary or not to have this data type or if it is better to satisfy this requirement using other techniques. This is better done by Sybase in its product features sheet (&lt;a href="http://www.sybase.com/detail?id=1036205"&gt;http://www.sybase.com/detail?id=1036205&lt;/a&gt; or search for the words column and encryption in sybase.com site if the previous link becomes broken).&lt;br /&gt;I know at least Sybase and Oracle 10g R2 are at this moment offering transparent data encryption at column level.&lt;br /&gt;&lt;br /&gt;So, I started thinking how it could be done in SQL Server 2005. Many fancy features came to my mind during this phase, however, I tried to simplify as much as possible while keeping an interesting level of functionality for the this UDT. These are some of the features implemented in the Compressed and Encrypted UDT:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Encryption is done using the Rijndael algorithm with a 256 bits Key and 128 bits IV derived from the pass phrase provided by the user.&lt;/li&gt;&lt;li&gt;The encrypted data is salted with random data to avoid obtaining the same encrypted data with the same input plain data. This contributes to make encryption stronger.&lt;/li&gt;&lt;li&gt;Prior to encryption, input plain data is compressed. This is not necessary at all, but I like compression and it is so easy to compress…&lt;br /&gt;Actually, the compression only takes place if the length of the original plain text is greater than 128 bytes as an attempt to avoid getting compressed data larger than plain data.&lt;/li&gt;&lt;li&gt;There is no need to use the SQL Server built-in functions to encrypt/decrypt the data. The UDT implementation does it for you (no more open symmetric key or EncryptByKey instructions for example). So, applications code is simpler.&lt;/li&gt;&lt;li&gt;Of course, you can create your own database master key and take care of it (backup it and store the backup in a secure site), but you can get ride of that work and let this implementation to create and maintain the database master key for you. In this way, when you restore the database in a different server, you only need to provide your secret pass phrase (which should be stored in the most secure site I know: your brain :-) )&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you want to see a demo about how to create and use this compressed and encrypted UDT read this article: &lt;a href="http://jcarlossaez.blogspot.com/2006/11/demo-for-compressed-and-encrypted-udt.html"&gt;http://jcarlossaez.blogspot.com/2006/11/demo-for-compressed-and-encrypted-udt.html&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36896703-116282977997040861?l=jcarlossaez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcarlossaez.blogspot.com/feeds/116282977997040861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36896703&amp;postID=116282977997040861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116282977997040861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116282977997040861'/><link rel='alternate' type='text/html' href='http://jcarlossaez.blogspot.com/2006/11/compressed-and-encrypted-user-defined.html' title='A compressed and encrypted User Defined Type (UDT) for SQL Server 2005'/><author><name>Juan Carlos</name><uri>http://www.blogger.com/profile/08356875516838829620</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36896703.post-116282492776204678</id><published>2006-11-06T15:43:00.000+01:00</published><updated>2006-11-06T16:00:57.890+01:00</updated><title type='text'>A demo for the compressed and encrypted UDT</title><content type='html'>During the demo, I will use the folder “C:\CompressEncrypt\” to run the demo. So if you want to run the demo by yourself in your computer, I will recommend you to create this folder. Doing this, you will be able to directly run the demo sample without changing any reference.&lt;br /&gt;&lt;br /&gt;• First of all, you will need the C# code that implements this UDT. Download it from &lt;a href="http://jcarlossaez.blogspot.com/2006/11/c-code-to-implement-compressed-and.html"&gt;http://jcarlossaez.blogspot.com/2006/11/c-code-to-implement-compressed-and.html&lt;/a&gt; and save it in a file , for example in C:\CompressEncrypt\CompEncString.cs .&lt;br /&gt;&lt;br /&gt;• Now, compile the code to generate the assembly. You can use the C# IDE or simply type at your command prompt this command:&lt;br /&gt;&lt;br /&gt;csc /out:C:\CompressEncrypt\CompEncString.dll /target:library C:\CompressEncrypt\CompEncString.cs&lt;br /&gt;&lt;br /&gt;• At his moment, you should have the assembly ready in the demo folder (C:\CompressEncrypt). Open a connection to your SQL Server 2005 to continue with the demo running the following T-SQL commands:&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: #aaaaaa 1px solid; BORDER-TOP: #aaaaaa 1px solid; MARGIN-LEFT: 10pt; BORDER-LEFT: #aaaaaa 1px solid; MARGIN-RIGHT: 2pt; BORDER-BOTTOM: #aaaaaa 1px solid"&gt;&lt;div style="FONT-SIZE: 10pt; BORDER-BOTTOM: #aaaaaa 1px solid" onclick="" selold="i;o.childNodes[1].style.display=" i="=" h="o.offsetHeight;o.style.height=" o="this.parentNode;j=" sh="new" j="" display="sh[1-j];o="&gt;h)o.style.height=h;" selold="2" sel="2"&gt;&lt;b&gt;Code &lt;/b&gt;&lt;a onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].innerText);alert('Code copied to clipboard');" href="javascript:"&gt;Copy &lt;/a&gt;&lt;input onclick="parentNode.sel=" type="radio"&gt;Hide&lt;input onclick="parentNode.sel=" type="radio"&gt;Scroll&lt;input onclick="parentNode.sel=" type="radio"&gt;Full&lt;/div&gt;&lt;div style="OVERFLOW: auto;font-family:'Microsoft Sans Serif';font-size:15px;color:#ffffe6;"   &gt;&lt;span style="color:#0000f0;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; nocount&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; on&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Create a demo database&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- better than destroy any existing one ;-)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;create&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; database&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;on&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (name=&lt;/span&gt;&lt;span style="color:#000000;"&gt;TestCompEncrypt_dat&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;filename&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'C:\CompressEncrypt\TestCompEncrypt_dat.mdf'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; )&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;use&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Enable CLR&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;sp_configure&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; 'clr enabled'&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;reconfigure&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Load the assembly (Important: change the path to the current location&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- of the assembly)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;create&lt;/span&gt;&lt;span style="color:#000000;"&gt; assembly CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;AUTHORIZATION&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;dbo&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; 'C:\CompressEncrypt\CompEncString.dll'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;WITH&lt;/span&gt;&lt;span style="color:#000000;"&gt; PERMISSION_SET&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; =&lt;/span&gt;&lt;span style="color:#000000;"&gt; SAFE&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Create the CompEncString user defined type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;CREATE&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; TYPE&lt;/span&gt;&lt;span style="color:#000000;"&gt; dbo&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;EXTERNAL&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; NAME&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.[&lt;/span&gt;&lt;span style="color:#000000;"&gt;CEString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;];&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Create the procedure to set up the keys derived&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- from user's passphrase&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;CREATE&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; PROCEDURE&lt;/span&gt;&lt;span style="color:#000000;"&gt; SetCEStringSecurity&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (@&lt;/span&gt;&lt;span style="color:#000000;"&gt;passphrase&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; nvarchar&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;500&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; ,@force&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; int&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;AS&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; EXTERNAL&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; NAME&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;EncryptionSetUp&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;SetCEStringSecurity&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Do all necessary work to correctly set up the KEY and IV derived from&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- user's pass phrase&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;exec&lt;/span&gt;&lt;span style="color:#000000;"&gt; SetCEStringSecurity&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; 'Put your favorite pass phrase here: Upper and lower case,and numbers or others especial chars ;-)'&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Create three tables: the first one store text using the native&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- SQL Server nvarchar type.&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- The second one uses the new CompEncString data type created.&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- The third one only stores varbinary information&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;create&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; NoEncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;MyText&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; nvarchar&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;4000&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;))&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;create&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;MyText CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;Create&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; RegularTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;myBinaryData varbinary&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;8000&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;))&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Add the same dummy content to the first two tables&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;declare&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; &lt;div style="MARGIN-LEFT: 20pt"&gt;insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; into&lt;/span&gt;&lt;span style="color:#000000;"&gt; NoEncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;values&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;replicate&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(cast(@&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; as&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; varchar&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;),&lt;/span&gt;&lt;span style="color:#800000;"&gt;4000&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;))&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; into&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;values&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;replicate&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(cast(@&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; as&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; varchar&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;),&lt;/span&gt;&lt;span style="color:#800000;"&gt;4000&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;))&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=@&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; +&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;/div&gt;end;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Compare the space required by both tables to store the same content&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;exec&lt;/span&gt;&lt;span style="color:#000000;"&gt; sp_spaceused&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; 'NoEncryptedTable'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;exec&lt;/span&gt;&lt;span style="color:#000000;"&gt; sp_spaceused&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; 'EncryptedTable'&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Verify we can read encrypted content&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; From&lt;/span&gt;&lt;span style="color:#000000;"&gt; Non&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; Encrypted]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; NoEncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; From&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; Encrypted]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Verify that encrypting the same text does not&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- generate the same ciphered raw data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;truncate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;declare&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; &lt;div style="MARGIN-LEFT: 20pt"&gt;insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; into&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;values&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;replicate&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'A'&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;4000&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;))&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=@&lt;/span&gt;&lt;span style="color:#000000;"&gt;cont&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; +&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;/div&gt;end;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyText Cipheredtext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt; PlainText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Change a text field to new compressed and encrypted type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;alter&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; NoEncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; alter&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; column&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyText CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Verify the content has been compressed and encrypted&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyText&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [Encrypted&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;],&lt;/span&gt;&lt;span style="color:#000000;"&gt;Mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Decrypted Content&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; NoEncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Directly insert encrypted data into the table&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Note: The binary data used is an instance of the&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- literal "1" compressed and encrypted&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;truncate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; into&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;values&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;x900000008D225B43FA0C19A9702837A0D4EDEE06CA79F3273862819C142D9BA2FF5E868718E8E1F45BEFCE6B9FA758C54B52AB3D201D09C64A7235E12C91E56FB1AFAC83EEBF90AE0A94DE1185181500D95CA41C67008A5EFF48DB65D8D35A4011C3C6C91FA5A667619D0AD198A0620D7F80FB03A523B5BF90F9AE4B5FBBA175E6995BFBCA8716551AEA6A91E84946D8A852BA3C&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Direct&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; of&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; encrypted&lt;/span&gt;&lt;span style="color:#000000;"&gt; content&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--Some samples to use with T-SQL.&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--Although the samples may seen meaningless, its purpose is only&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--to show the capabilities. After reading it, you could use this&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--data type to easily send encrypted mail messages between SQL Servers&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--or use your existing data replication infrastructure to encrypt data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--while it is sent from source server to target server without any&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--change in the replication infrastructure. (obviously, source and&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--target server must have the same secret pass phrase)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- In memory compresion and encryption&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;declare&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=cast(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'Dummy test compressed and encrypted in memory.'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; as&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- What does encrypted information look like?&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [In&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; memory&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; encrypted&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; data]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- And decrypted?&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [In&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; memory&lt;/span&gt;&lt;span style="color:#000000;"&gt; decrypted&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; data]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- A way to manipulate encrypted data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=cast(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'Ooops! I forgot this...'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; +&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; as&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;More&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; In&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; memory&lt;/span&gt;&lt;span style="color:#000000;"&gt; decrypted&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; data]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Save the encrypted data in a table with encrypted data type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;truncate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; table&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; into&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;values&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (@&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [Data&lt;/span&gt;&lt;span style="color:#000000;"&gt; inserted&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; T&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;-SQL&lt;/span&gt;&lt;span style="color:#000000;"&gt; routine&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]from&lt;/span&gt;&lt;span style="color:#000000;"&gt; EncryptedTable&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- save the encrypted data in a table that is not using&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- ComEmcString data type (raw binary).&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- NOTE: This table could be&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- included in the replicated tables set&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- as it does not contain "nothing strange"&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; into&lt;/span&gt;&lt;span style="color:#000000;"&gt; RegularTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;myBinaryData&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; values&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (cast(@&lt;/span&gt;&lt;span style="color:#000000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; as&lt;/span&gt;&lt;span style="color:#000000;"&gt; varbinary&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;8000&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)))&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--Recover the inserted data and decrypt it&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--NOTE:this acction could be done in the SQL Server&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--that is the reader of the subscription..&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;declare&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;b CompEncString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;b&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;myBinaryData&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; RegularTable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; @&lt;/span&gt;&lt;span style="color:#000000;"&gt;b&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Decrypted&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; binary information&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Let's backup the database&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;Backup&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; database&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;to&lt;/span&gt;&lt;span style="color:#000000;"&gt; disk&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'C:\CompressEncrypt\TestCompEncrypt.bak'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;with&lt;/span&gt;&lt;span style="color:#000000;"&gt; init&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Lets simulate a crash. Our database disappears.&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- At this moment we haven't master key back up.&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Normally, this means that although we have a database&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- backup, we have lost encrypted data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;use&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; master&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;drop&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; database&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="DISPLAY: none; BACKGROUND-COLOR: #ffffe6"&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;•Copy the backup file in a second SQL Server. I will assume you will copy it in the second server in the folder C:\CompressEncrypt.&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: #aaaaaa 1px solid; BORDER-TOP: #aaaaaa 1px solid; MARGIN-LEFT: 10pt; BORDER-LEFT: #aaaaaa 1px solid; MARGIN-RIGHT: 2pt; BORDER-BOTTOM: #aaaaaa 1px solid"&gt;&lt;div style="FONT-SIZE: 10pt; BORDER-BOTTOM: #aaaaaa 1px solid" onclick="" selold="i;o.childNodes[1].style.display=" i="=" h="o.offsetHeight;o.style.height=" o="this.parentNode;j=" sh="new" j="" display="sh[1-j];o="&gt;h)o.style.height=h;" selold="2" sel="2"&gt;&lt;b&gt;Code &lt;/b&gt;&lt;a onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].innerText);alert('Code copied to clipboard');" href="javascript:"&gt;Copy &lt;/a&gt;&lt;input onclick="parentNode.sel=" type="radio"&gt;Hide&lt;input onclick="parentNode.sel=" type="radio"&gt;Scroll&lt;input onclick="parentNode.sel=" type="radio"&gt;Full&lt;/div&gt;&lt;div style="OVERFLOW: auto;font-family:'Microsoft Sans Serif';font-size:15px;color:#d9ffec;"   &gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--Connect to the second server&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Restore the database&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;use&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; master&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; exists&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; (select&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; master.&lt;/span&gt;&lt;span style="color:#000000;"&gt;dbo&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;sysdatabases&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; where&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; =&lt;/span&gt;&lt;span style="color:#000000;"&gt; N&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'TestCompEncrypt'&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; &lt;div style="MARGIN-LEFT: 20pt"&gt;drop&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; database&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;/div&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;restore&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; database&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; disk&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'C:\CompressEncrypt\TestCompEncrypt.bak'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Check what we can see&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;use&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Decrypted&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; after&lt;/span&gt;&lt;span style="color:#000000;"&gt; restoring DB&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; from&lt;/span&gt;&lt;span style="color:#000000;"&gt; encryptedtable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Recreate the security environment by calling SetCEStringSecurity&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- with our secret pass phrase&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;exec&lt;/span&gt;&lt;span style="color:#000000;"&gt; SetCEStringSecurity&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; 'Put your favorite pass phrase here: Upper and lower case,and numbers or others especial chars ;-)'&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- Now, we can see the encrypted content we had&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- at the backup time&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; mytext&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;ToString&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;Decrypted&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; after&lt;/span&gt;&lt;span style="color:#000000;"&gt; restoring DB&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; and&lt;/span&gt;&lt;span style="color:#000000;"&gt; setting up&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; security]from&lt;/span&gt;&lt;span style="color:#000000;"&gt; encryptedtable&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;-- And that's all, drop the database in the second server&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;i&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;use&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; master&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;drop&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000f0;"&gt; database&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestCompEncrypt&lt;/span&gt;&lt;span style="color:#0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="DISPLAY: none; BACKGROUND-COLOR: #d9ffec"&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36896703-116282492776204678?l=jcarlossaez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcarlossaez.blogspot.com/feeds/116282492776204678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36896703&amp;postID=116282492776204678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116282492776204678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116282492776204678'/><link rel='alternate' type='text/html' href='http://jcarlossaez.blogspot.com/2006/11/demo-for-compressed-and-encrypted-udt.html' title='A demo for the compressed and encrypted UDT'/><author><name>Juan Carlos</name><uri>http://www.blogger.com/profile/08356875516838829620</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36896703.post-116256768836671025</id><published>2006-11-03T16:26:00.000+01:00</published><updated>2006-11-06T17:31:47.670+01:00</updated><title type='text'>C# code to implement a compressed and encrypted User Defined Type (UDT) in SQL Server 2005</title><content type='html'>&lt;div style="BORDER-RIGHT: #aaaaaa 1px solid; BORDER-TOP: #aaaaaa 1px solid; MARGIN-LEFT: 10pt; BORDER-LEFT: #aaaaaa 1px solid; MARGIN-RIGHT: 2pt; BORDER-BOTTOM: #aaaaaa 1px solid"&gt;&lt;div style="FONT-SIZE: 10pt; BORDER-BOTTOM: #aaaaaa 1px solid" onclick="" i="=" i="this.sel,j;for(j=" h="o.offsetHeight;o.style.height=" display="sh[1-j];o=" selold="i;o.childNodes[1].style.display=" o="this.parentNode;j=" sh="new" i=" 0;j&lt;3;j++)this.childNodes[2+j*2].checked=" j=""&gt;h)o.style.height=h;" selold="2" sel="2"&gt;&lt;b&gt;Code &lt;/b&gt;&lt;a onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].innerText);alert('Code copied to clipboard');" href="javascript:"&gt;Copy &lt;/a&gt;&lt;input onclick="parentNode.sel=" type="radio"&gt;Hide&lt;input onclick="parentNode.sel=" type="radio"&gt;Scroll&lt;input onclick="parentNode.sel=" type="radio"&gt;Full&lt;/div&gt;&lt;div style="FONT-SIZE: 15px; OVERFLOW: auto; FONT-FAMILY: 'Courier New'; BACKGROUND-COLOR: #ffffe6"&gt;&lt;span style="color:#008000;"&gt;//&lt;br /&gt;//Begining of sample code&lt;br /&gt;//&lt;br /&gt;// This software is provided 'as-is', without any express&lt;br /&gt;// or implied warranty.  In no event will the author be&lt;br /&gt;// held liable for any damages arising from the use of this&lt;br /&gt;// software.&lt;br /&gt;//&lt;br /&gt;// The purpose of this code is to implement a compressed&lt;br /&gt;// and encrypted User Defined Type for SQL Server 2005&lt;br /&gt;//&lt;br /&gt;// To compile the code and generate the corresponding assembly&lt;br /&gt;// copy the content between the literal&lt;br /&gt;// "//Begining of sample code" and "//ending of sample code",&lt;br /&gt;// save it in a file (for example in&lt;br /&gt;// C:\CompressEncrypt\CompEncString.cs) and at the command&lt;br /&gt;// prompt type:&lt;br /&gt;//&lt;br /&gt;//    csc /out:C:\CompressEncrypt\CompEncString.dll&lt;br /&gt;//    /target:library C:\CompressEncrypt\CompEncString.cs&lt;br /&gt;//&lt;br /&gt;// assuming the c# compiler is in your path variable&lt;br /&gt;// or  use the c# IDE&lt;br /&gt;//&lt;br /&gt;// For a detailed sample about haw this UDT can be used,&lt;br /&gt;// read my post&lt;br /&gt;// &lt;a href="http://jcarlossaez.blogspot.com/2006/11/compressed-and-encrypted-user-defined.html"&gt;http://jcarlossaez.blogspot.com/2006/11/compressed-and-encrypted-user-defined.html&lt;/a&gt;&lt;br /&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System.Data.SqlTypes;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System.Data.SqlClient;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; Microsoft.SqlServer.Server;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System.IO;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System.IO.Compression;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System.Text;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;using&lt;/span&gt; System.Security.Cryptography;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;namespace&lt;/span&gt; CEString&lt;br /&gt;{&lt;br /&gt;    [&lt;span style="color:#008080;"&gt;Serializable&lt;/span&gt;]&lt;br /&gt;    [&lt;span style="color:#008080;"&gt;SqlUserDefinedType&lt;/span&gt;(&lt;span style="color:#008080;"&gt;Format&lt;/span&gt;.UserDefined, IsByteOrdered =&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;,&lt;br /&gt;        MaxByteSize = 8000, Name =&lt;span style="color:#800000;"&gt; "CompEncString"&lt;/span&gt;, IsFixedLength =&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; class&lt;/span&gt;&lt;span style="color:#008080;"&gt; CompEncString&lt;/span&gt; :&lt;span style="color:#008080;"&gt; INullable&lt;/span&gt;,&lt;span style="color:#008080;"&gt; IBinarySerialize&lt;/span&gt;&lt;br /&gt;    {&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;    #region&lt;/span&gt; private state and constructors&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Original plain text&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; m_String;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Plain text ompressed and encrypted&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] m_Bytes;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Salt min and max len&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; minSaltLen = 4;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; maxSaltLen = 32;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Min len of plain text to fire compression&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; MinLenToCompress = 128;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt; CompEncString(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; value)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            this&lt;/span&gt;.m_String = value;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            this&lt;/span&gt;.m_Bytes = GetCompressedEncryptedBytes(&lt;span style="color:#008080;"&gt;Encoding&lt;/span&gt;.Unicode.GetBytes(value));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt; CompEncString(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] bytes)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            this&lt;/span&gt;.m_Bytes = bytes;&lt;br /&gt;        }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; bool&lt;/span&gt; IsNull&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            get&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; this&lt;/span&gt;.m_String ==&lt;span style="color:#0000ff;"&gt; null&lt;/span&gt; &amp;&amp;amp;&lt;span style="color:#0000ff;"&gt; this&lt;/span&gt;.m_Bytes ==&lt;span style="color:#0000ff;"&gt; null&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#008080;"&gt; CompEncString&lt;/span&gt; Null&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            get&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#008080;"&gt;                CompEncString&lt;/span&gt; str =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; CompEncString&lt;/span&gt;((&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;)&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt; str;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt; CompEncString()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region&lt;/span&gt; Parse/ToString Methods&lt;br /&gt;&lt;br /&gt;        [Microsoft.SqlServer.Server.&lt;span style="color:#008080;"&gt;SqlMethod&lt;/span&gt;(IsDeterministic =&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;,&lt;br /&gt;            IsPrecise =&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;, DataAccess =&lt;span style="color:#008080;"&gt; DataAccessKind&lt;/span&gt;.Read,&lt;br /&gt;            SystemDataAccess =&lt;span style="color:#008080;"&gt; SystemDataAccessKind&lt;/span&gt;.None)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; override&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; ToString()&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Returns de original text by decrypting and decompressing&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.m_Bytes !=&lt;span style="color:#0000ff;"&gt; null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                this&lt;/span&gt;.m_String = GetDecryptedDecompressedString(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.m_Bytes);&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                this&lt;/span&gt;.m_String =&lt;span style="color:#0000ff;"&gt; null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; this&lt;/span&gt;.m_String;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;        [Microsoft.SqlServer.Server.&lt;span style="color:#008080;"&gt;SqlMethod&lt;/span&gt;(DataAccess =&lt;span style="color:#008080;"&gt; DataAccessKind&lt;/span&gt;.Read,&lt;br /&gt;            SystemDataAccess =&lt;span style="color:#008080;"&gt; SystemDataAccessKind&lt;/span&gt;.None)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#008080;"&gt; CompEncString&lt;/span&gt; Parse(&lt;span style="color:#008080;"&gt;SqlString&lt;/span&gt; sqlString)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Performs compression and encryption of original plain text&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (sqlString.IsNull)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;&lt;span style="color:#008080;"&gt; CompEncString&lt;/span&gt;.Null;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; CompEncString&lt;/span&gt;(sqlString.Value);&lt;br /&gt;        }&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region&lt;/span&gt; IBinarySerialize Members&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; void&lt;/span&gt; Write(System.IO.&lt;span style="color:#008080;"&gt;BinaryWriter&lt;/span&gt; w)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Writes the binary data (compressed and encrypted) adding&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //a small header which represents the len of binary data&lt;/span&gt;&lt;br /&gt;            w.Write(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.m_Bytes.Length);&lt;br /&gt;            w.Write(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.m_Bytes);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; void&lt;/span&gt; Read(System.IO.&lt;span style="color:#008080;"&gt;BinaryReader&lt;/span&gt; r)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Reads the binary data. The len of the data&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //to be read is in the data header&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            int&lt;/span&gt; length = r.ReadInt32();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            this&lt;/span&gt;.m_Bytes = r.ReadBytes(length);&lt;br /&gt;&lt;br /&gt;        }&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region&lt;/span&gt; conversion to/from compressed and encrypted strings&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] GetCompressedEncryptedBytes(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] input)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Compress and encrypt the array of bytes received as parameter&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Compression is done with GZipStream. After original plain text has&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //been compressed, it is encrypted using Rijndael algorithm and the Key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //and IV stored in the database.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Previous to encrypting, Random data is pre-appended to byte array (salt)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //to generate different encrypted array for the same plain text&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] output;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] compressedsalted;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] rKey =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[32];&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] rIV =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[16];&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Get KEY and IV&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (GetKEYIV(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; rKey,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; rIV) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //We can not read key and IV&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                throw&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; Exception&lt;/span&gt;(&lt;span style="color:#800000;"&gt;"It has not been possible to get KEY and IV to encrypt data.\n"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "Try running the procedure SetCEStringSecurity to correctly set up KEY and IV"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (input.Length &gt;= MinLenToCompress)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;MemoryStream&lt;/span&gt; ms =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; MemoryStream&lt;/span&gt;())&lt;br /&gt;                {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //Compress the original byte array&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;GZipStream&lt;/span&gt; gz =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; GZipStream&lt;/span&gt;(ms,&lt;span style="color:#008080;"&gt; CompressionMode&lt;/span&gt;.Compress,&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;))&lt;br /&gt;                        gz.Write(input, 0, input.Length);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //Add random data to the compressed result&lt;/span&gt;&lt;br /&gt;                    compressedsalted =&lt;span style="color:#0000ff;"&gt; this&lt;/span&gt;.AddSalt(ms.ToArray());&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //Add random data to plain text&lt;/span&gt;&lt;br /&gt;                compressedsalted =&lt;span style="color:#0000ff;"&gt; this&lt;/span&gt;.AddSalt(input);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Encrypt salted data&lt;/span&gt;&lt;br /&gt;            output = Encrypt(compressedsalted,rKey,rIV);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt; output;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; GetDecryptedDecompressedString(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] input)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Decrypt and decompress the array of bytes received as parameter.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Decryption is done using Rijndael algorithm and the Key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //and IV stored in the database.Then, the random data added (salt)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //is removed and finally, the resulting array is decompressed using&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //GZipStream.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            const&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; MaxDeccompressedSize = 8000;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] output =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[MaxDeccompressedSize];&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            int&lt;/span&gt; length = 0;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] compressedsalted;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] rKey =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[32];&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] rIV =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[16];&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Get the KEY and IV&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (GetKEYIV(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; rKey,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; rIV) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //We can not read key and IV&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                throw&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; Exception&lt;/span&gt;(&lt;span style="color:#800000;"&gt;"It has not been possible to get KEY and IV to encrypt data.\n"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "Try running the procedure SetCEStringSecurity to correctly set up KEY and IV"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Decrypt the byte array&lt;/span&gt;&lt;br /&gt;            compressedsalted = Decrypt(input, rKey,rIV);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Remove random data from the decrypted array&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Firts, get the salt len&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            int&lt;/span&gt; saltLen =   (compressedsalted[0] &amp; 0x03)&lt;br /&gt;            (compressedsalted[1] &amp; 0x0c)&lt;br /&gt;            (compressedsalted[2] &amp; 0x30)&lt;br /&gt;            (compressedsalted[3] &amp; 0xc0);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Copy original plain text discarding the salt value&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            Array&lt;/span&gt;.Copy(compressedsalted, saltLen, output,&lt;br /&gt;                    0, compressedsalted.Length - saltLen);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Check gzip header magic number. Perhaps, the original&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //plain text was not compressed because it was too short&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; ((output[0] == 0x1f) &amp; (output[1] == 0x8b))&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                try&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //Now decompress the array to obtain the original plain text&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //As the plain text can not be larger than 8000 bytes, lets&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //decompress in one single step, allocating enough memory&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;MemoryStream&lt;/span&gt; ms =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; MemoryStream&lt;/span&gt;(output))&lt;br /&gt;                    {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                        using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;GZipStream&lt;/span&gt; gz =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; GZipStream&lt;/span&gt;(ms,&lt;span style="color:#008080;"&gt; CompressionMode&lt;/span&gt;.Decompress,&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;))&lt;br /&gt;                        {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                            int&lt;/span&gt; numBytesRead = 0;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                            int&lt;/span&gt; offset = 0;&lt;br /&gt;                            numBytesRead = gz.Read(output, offset, MaxDeccompressedSize);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                            if&lt;/span&gt; (numBytesRead == 0)&lt;br /&gt;&lt;span style="color:#008080;"&gt;                                Array&lt;/span&gt;.Resize&lt;&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;&gt;(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; output, length);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                            else&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; if&lt;/span&gt; (numBytesRead &lt; MaxDeccompressedSize)&lt;br /&gt;&lt;span style="color:#008080;"&gt;                                Array&lt;/span&gt;.Resize&lt;&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;&gt;(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; output, numBytesRead);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                catch&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //incorrect gzip format! little to do. Just return as plain text&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    return&lt;/span&gt;&lt;span style="color:#008080;"&gt; Encoding&lt;/span&gt;.Unicode.GetString(output);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;&lt;span style="color:#008080;"&gt; Encoding&lt;/span&gt;.Unicode.GetString(output);&lt;br /&gt;        }&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region&lt;/span&gt; Helper functions for encryption&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Encrypt a byte array into a byte array using Rijndael,a key and an IV&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] Encrypt(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] clearData,&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] Key,&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] IV)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Encryption artifacts&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            MemoryStream&lt;/span&gt; ms =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; MemoryStream&lt;/span&gt;();&lt;br /&gt;&lt;span style="color:#008080;"&gt;            Rijndael&lt;/span&gt; enc =&lt;span style="color:#008080;"&gt; Rijndael&lt;/span&gt;.Create();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Set the KEY and IV&lt;/span&gt;&lt;br /&gt;            enc.Key = Key;&lt;br /&gt;            enc.IV = IV;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //explicitly set properties, even if they have default values&lt;/span&gt;&lt;br /&gt;            enc.Mode =&lt;span style="color:#008080;"&gt; CipherMode&lt;/span&gt;.CBC;&lt;br /&gt;            enc.Padding =&lt;span style="color:#008080;"&gt; PaddingMode&lt;/span&gt;.PKCS7;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Perform encryption&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            CryptoStream&lt;/span&gt; cs =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; CryptoStream&lt;/span&gt;(ms, enc.CreateEncryptor(),&lt;br /&gt;&lt;span style="color:#008080;"&gt;                CryptoStreamMode&lt;/span&gt;.Write);&lt;br /&gt;            cs.Write(clearData, 0, clearData.Length);&lt;br /&gt;            cs.Close();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Return encrypted array&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt; ms.ToArray();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // Decrypt a byte array into a byte array using Rijndael,a key and an IV&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] Decrypt(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] cipherData,&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] Key,&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] IV)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Decryption artifacts&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            MemoryStream&lt;/span&gt; ms =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; MemoryStream&lt;/span&gt;();&lt;br /&gt;&lt;span style="color:#008080;"&gt;            Rijndael&lt;/span&gt; dec =&lt;span style="color:#008080;"&gt; Rijndael&lt;/span&gt;.Create();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Set the KEY and IV&lt;/span&gt;&lt;br /&gt;            dec.Key = Key;&lt;br /&gt;            dec.IV = IV;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //explicitly set properties, even if they have default values&lt;/span&gt;&lt;br /&gt;            dec.Mode =&lt;span style="color:#008080;"&gt; CipherMode&lt;/span&gt;.CBC;&lt;br /&gt;            dec.Padding =&lt;span style="color:#008080;"&gt; PaddingMode&lt;/span&gt;.PKCS7;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Perform decryption&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            CryptoStream&lt;/span&gt; cs =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; CryptoStream&lt;/span&gt;(ms, dec.CreateDecryptor(),&lt;br /&gt;&lt;span style="color:#008080;"&gt;                CryptoStreamMode&lt;/span&gt;.Write);&lt;br /&gt;            cs.Write(cipherData, 0, cipherData.Length);&lt;br /&gt;            cs.Close();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Return recrypted array&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt; ms.ToArray();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; bool&lt;/span&gt; GetKEYIV(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] Key,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] IV)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Reads the KEY and IV stored in the database, in the table SecurityGuard&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //and encrypted using an asymmetric key named k_CEStringProtector&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            string&lt;/span&gt; sqlsentence;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Prepare the sentence to decrypt and read the encryption key and IV&lt;/span&gt;&lt;br /&gt;            sqlsentence =&lt;span style="color:#800000;"&gt; "select DecryptByAsymKey(AsymKey_ID('k_CEStringProtector'),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardKey) frKEY,DecryptByAsymKey(AsymKey_ID('k_CEStringProtector'),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardIV) frIV from SecurityGuard where "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardName='default'"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;SqlConnection&lt;/span&gt; connection =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; SqlConnection&lt;/span&gt;(&lt;span style="color:#800000;"&gt;"context connection=true"&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                connection.Open();&lt;br /&gt;&lt;span style="color:#008080;"&gt;                SqlCommand&lt;/span&gt; command =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; SqlCommand&lt;/span&gt;(sqlsentence, connection);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                try&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //Read the KEY and IV. If nothing is present, returns false&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;&lt;span style="color:#008080;"&gt;                    SqlDataReader&lt;/span&gt; reader = command.ExecuteReader();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    if&lt;/span&gt; (reader.HasRows)&lt;br /&gt;                    {&lt;br /&gt;                        reader.Read();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                        if&lt;/span&gt; (reader.GetSqlBytes(0).IsNull ==&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;  reader.GetSqlBytes(1).IsNull ==&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                            return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                        //Load the key&lt;/span&gt;&lt;br /&gt;                        reader.GetBytes(0, 0, Key, 0, 32);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                        //Load the IV&lt;/span&gt;&lt;br /&gt;                        reader.GetBytes(1, 0, IV, 0, 16);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                        return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;;&lt;br /&gt;                    }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                        return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                catch&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; Adds an array of randomly generated bytes at the beginning of the&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; array holding original plain text value.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This code has been borrowed from&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; http://www.obviex.com/samples/EncryptionWithSalt.aspx&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] AddSalt(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] plainTextBytes)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Generate the salt.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] saltBytes = GenerateSalt();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Allocate array which will hold salt and plain text bytes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] plainTextBytesWithSalt =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[plainTextBytes.Length +&lt;br /&gt;                                                     saltBytes.Length];&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // First, copy salt bytes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            Array&lt;/span&gt;.Copy(saltBytes, plainTextBytesWithSalt, saltBytes.Length);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Append plain text bytes to the salt value.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            Array&lt;/span&gt;.Copy(plainTextBytes, 0,&lt;br /&gt;                        plainTextBytesWithSalt, saltBytes.Length,&lt;br /&gt;                        plainTextBytes.Length);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt; plainTextBytesWithSalt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; Generates an array holding cryptographically strong bytes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This code has been borrowed from&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; http://www.obviex.com/samples/EncryptionWithSalt.aspx&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] GenerateSalt()&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            int&lt;/span&gt; saltLen = 0;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Use random number generator to calculate salt length.&lt;/span&gt;&lt;br /&gt;            saltLen = GenerateRandomNumber(minSaltLen, maxSaltLen);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Allocate byte array to hold our salt.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] salt =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[saltLen];&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Populate salt with cryptographically strong bytes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            RNGCryptoServiceProvider&lt;/span&gt; rng =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; RNGCryptoServiceProvider&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;            rng.GetNonZeroBytes(salt);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Split salt length (always one byte) into four two-bit pieces and&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // store these pieces in the first four bytes of the salt array.&lt;/span&gt;&lt;br /&gt;            salt[0] = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;)((salt[0] &amp; 0xfc)  (saltLen &amp;amp; 0x03));&lt;br /&gt;            salt[1] = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;)((salt[1] &amp; 0xf3)  (saltLen &amp;amp; 0x0c));&lt;br /&gt;            salt[2] = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;)((salt[2] &amp; 0xcf)  (saltLen &amp;amp; 0x30));&lt;br /&gt;            salt[3] = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;)((salt[3] &amp; 0x3f)  (saltLen &amp;amp; 0xc0));&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt; salt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; Generates random integer&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This code has been borrowed from&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;        ///&lt;/span&gt;&lt;span style="color:#008000;"&gt; http://www.obviex.com/samples/EncryptionWithSalt.aspx&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; GenerateRandomNumber(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; minValue,&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; maxValue)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // We will make up an integer seed from 4 bytes of this array.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            byte&lt;/span&gt;[] randomBytes =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[4];&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Generate 4 random bytes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            RNGCryptoServiceProvider&lt;/span&gt; rng =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; RNGCryptoServiceProvider&lt;/span&gt;();&lt;br /&gt;            rng.GetBytes(randomBytes);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Convert four random bytes into a positive integer value.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            int&lt;/span&gt; seed = ((randomBytes[0] &amp; 0x7f) &lt;&lt; 24)&lt;br /&gt;                        (randomBytes[1] &lt;&lt; 16)&lt;br /&gt;                        (randomBytes[2] &lt;&lt; 8)&lt;br /&gt;                        (randomBytes[3]);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Now, this looks more like real randomization.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;            Random&lt;/span&gt; random =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; Random&lt;/span&gt;(seed);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // Calculate a random number.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt; random.Next(minValue, maxValue + 1);&lt;br /&gt;        }&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; class&lt;/span&gt;&lt;span style="color:#008080;"&gt; EncryptionSetUp&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; readonly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; CRLF = System.&lt;span style="color:#008080;"&gt;Environment&lt;/span&gt;.NewLine;&lt;br /&gt;    [Microsoft.SqlServer.Server.&lt;span style="color:#008080;"&gt;SqlProcedure&lt;/span&gt;]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; void&lt;/span&gt; SetCEStringSecurity(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PassPhrase,&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; Force)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //This procedure executes the necessary work to set up all the necessary&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //infrastructure for the Compressed and Encrypted user defined type:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // - Checks for the existence of database master key. If not present, a&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // master key is created and encrypted using the user's pass phrase&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // -Checks for the existence of the asymmetric key k_CEStringProtector&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // used to encrypt the symmetric key and IV. If it doesn't exist, it&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // is created.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // - Additionally, not only the presence of these keys is checked, but also&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // also their usability, trying to hide to the user all the necessary work&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // to set up security: the user only needs to rememeber the pass phrase&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // - Once the master key and the asymmetric key are up, the table SecurityGuard&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // is created, a symmetric key and a IV are derived from the user's pass phrase&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // and all of this information (pass phrase, KEY and IV) is stored in the table&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        // encrypted by the asymmetric key k_CEStringProtector.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; sqlsentence;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; MessageInCaseOfError =&lt;span style="color:#800000;"&gt; ""&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; sqlPassPhrase;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        byte&lt;/span&gt;[] rKEY =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[32];&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        byte&lt;/span&gt;[] rIV =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[16];&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        int&lt;/span&gt; result = 0;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //escape single quotation mark from pass phrase&lt;/span&gt;&lt;br /&gt;        sqlPassPhrase = PassPhrase.Replace(&lt;span style="color:#800000;"&gt;"'"&lt;/span&gt;,&lt;span style="color:#800000;"&gt; "''"&lt;/span&gt;);&lt;br /&gt;        GenerateKEYIV(PassPhrase,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; rKEY,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; rIV);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Check DB master key exists&lt;/span&gt;&lt;br /&gt;        sqlsentence =&lt;span style="color:#800000;"&gt; "select count(*) from sys.symmetric_keys "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "where symmetric_key_id=101"&lt;/span&gt;;&lt;br /&gt;        MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error trying to guess if your database "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "has DB master key created: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //We can not continue without db master key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (result == 0)&lt;span style="color:#008000;"&gt; //No Db master Key present, lets create it&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            sqlsentence =&lt;span style="color:#800000;"&gt; "create master key encryption by password='"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "'"&lt;/span&gt;;&lt;br /&gt;            MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Since the database has not a mster key created,the "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "system has tried to create it for you using the pass phrase you "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "provided, but the following error ocurred: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //We can not continue without db master key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Lets check the asymmetric key&lt;/span&gt;&lt;br /&gt;        sqlsentence =&lt;span style="color:#800000;"&gt; "select count(*) from sys.asymmetric_keys where name='k_CEStringProtector'"&lt;/span&gt;;&lt;br /&gt;        MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error trying to guess if your database has "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "the asymetric key created: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //We can not continue if we are not able to check&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (result == 0)&lt;span style="color:#008000;"&gt; //No assymetric Key present, lets create it&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            sqlsentence =&lt;span style="color:#800000;"&gt; "create asymmetric key k_CEStringProtector WITH ALGORITHM = RSA_2048"&lt;/span&gt;;&lt;br /&gt;            MessageInCaseOfError =&lt;span style="color:#800000;"&gt; ""&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (ExecuteSQLWithNoResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //We can still try to open master key using the provided pass phrase&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //as last chance (perhaps the database has been restored in a different&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //server and the master key needs to be reencrypted&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (ReOpenDatabaseMasterKey(sqlPassPhrase) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //We can not continue with no usable master key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                else&lt;/span&gt;&lt;span style="color:#008000;"&gt; //Master key restored, re-try asymmetric key creation&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    sqlsentence =&lt;span style="color:#800000;"&gt; "create asymmetric key k_CEStringProtector WITH ALGORITHM = RSA_2048"&lt;/span&gt;;&lt;br /&gt;                    MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "It has been not possible to create the "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                        "asymmetric master key: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    if&lt;/span&gt; (ExecuteSQLWithNoResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                        return&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Lets check if the asymmetric key is ready to encrypt&lt;/span&gt;&lt;br /&gt;        sqlsentence =&lt;span style="color:#800000;"&gt; "select convert(int,isnull(convert(varchar(50),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "decryptbyasymkey(asymkey_id('k_CEStringProtector'),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "encryptbyasymkey(asymkey_id('k_CEStringProtector'),'1'))),0))"&lt;/span&gt;;&lt;br /&gt;        MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error trying to check asymmetric key availability: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //We can not continue since asymmetric encryption does not work&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (result != 1)&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //Asymmetric key not correctly working, lets try to re-open master key&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //We can still try to open master key using the provided pass phrase&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //as last chance (perhaps the database has been restored in a different&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //server and the master key needs to be reencrypted&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (ReOpenDatabaseMasterKey(sqlPassPhrase) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            else&lt;/span&gt;&lt;span style="color:#008000;"&gt; //Master key restored, re-try asymmetric key encryption&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                sqlsentence =&lt;span style="color:#800000;"&gt; "select convert(int,isnull(convert(varchar(50),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "decryptbyasymkey(asymkey_id('k_CEStringProtector'),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "encryptbyasymkey(asymkey_id('k_CEStringProtector'),'1'))),0))"&lt;/span&gt;;&lt;br /&gt;                MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "It has been not possible to create the asymmetric "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "master key: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (result != 1)&lt;br /&gt;&lt;span style="color:#008000;"&gt;                    //Asymmetric key still not correctly working, we can't do anything more&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "It has been not possible to create the "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                        "asymmetric master key: "&lt;/span&gt; + CRLF + MessageInCaseOfError;&lt;br /&gt;                    SendFeedBackToUser(MessageInCaseOfError);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    return&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Here we are with a master key and an asymmetric key ready for use.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Create the table to store the pass phrase and dervied keys&lt;/span&gt;&lt;br /&gt;        sqlsentence =&lt;span style="color:#800000;"&gt; "if not exists (select * from sys.sysobjects where id = "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "object_id(N'[SecurityGuard]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "CREATE TABLE [SecurityGuard]("&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "[SecurityGuardName] [nvarchar](50)  NOT NULL,"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "[SecurityGuardPassPhrase] [varbinary](500) NULL,"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "[SecurityGuardKey] [varbinary](500) NULL,"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "[SecurityGuardIV] [varbinary](500) NULL,"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "CONSTRAINT [PK_SecurityGuard] PRIMARY KEY CLUSTERED "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "([SecurityGuardName] ASC))"&lt;/span&gt; + CRLF;&lt;br /&gt;        MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error creating the table to store your pass phrase: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (ExecuteSQLWithNoResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //If there is not pass phrase with keys, create them&lt;/span&gt;&lt;br /&gt;        sqlsentence =&lt;span style="color:#800000;"&gt; "select count(*) from SecurityGuard where SecurityGuardName='default'"&lt;/span&gt;;&lt;br /&gt;        MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error reading the table to store your pass phrase: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //We can not continue&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (result != 1)&lt;span style="color:#008000;"&gt; //Thre is no pass phrase, lets create it&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            sqlsentence =&lt;span style="color:#800000;"&gt; "insert into SecurityGuard (SecurityGuardName,"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardPassPhrase,SecurityGuardKey,SecurityGuardIV)"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "values ('default',"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "EncryptByPassPhrase (N'"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "',N'"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "'),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "EncryptByAsymKey(AsymKey_ID('k_CEStringProtector'),0x"&lt;/span&gt; + GetHexStringFromBytes(rKEY) +&lt;span style="color:#800000;"&gt; "),"&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "EncryptByAsymKey(AsymKey_ID('k_CEStringProtector'),0x"&lt;/span&gt; + GetHexStringFromBytes(rIV) +&lt;span style="color:#800000;"&gt; "))"&lt;/span&gt;;&lt;br /&gt;                MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error storing your pass phrase: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (ExecuteSQLWithNoResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //There is a pass phrase. Lets check it is the same the user is providing now&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            // In such case, we will update the keys. If they are different, only update&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //if the parameter Force is 1&lt;/span&gt;&lt;br /&gt;            sqlsentence =&lt;span style="color:#800000;"&gt; "select count(*) from SecurityGuard where SecurityGuardName='default' "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "and convert(nvarchar(500),DecryptByPassPhrase(N'"&lt;/span&gt; + sqlPassPhrase +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "',SecurityGuardPassPhrase))=N'"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "'"&lt;/span&gt;;&lt;br /&gt;            MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error reading the table to store your "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "pass phrase: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; (ExecuteSQLWithResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; result,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            if&lt;/span&gt; ((result == 1)  (Force == 1))&lt;br /&gt;            {&lt;br /&gt;                sqlsentence =&lt;span style="color:#800000;"&gt; "update SecurityGuard set "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardPassPhrase = EncryptByPassPhrase (N'"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "',N'"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "'), "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardKey = EncryptByAsymKey(AsymKey_ID('k_CEStringProtector'),0x"&lt;/span&gt; + GetHexStringFromBytes(rKEY) +&lt;span style="color:#800000;"&gt; "), "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "SecurityGuardIV=EncryptByAsymKey(AsymKey_ID('k_CEStringProtector'),0x"&lt;/span&gt; + GetHexStringFromBytes(rIV) +&lt;span style="color:#800000;"&gt; ") "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                "where SecurityGuardName='default'"&lt;/span&gt;;&lt;br /&gt;                MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "Unexpected error updating your pass phrase: "&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (ExecuteSQLWithNoResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    return&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            else&lt;/span&gt;&lt;span style="color:#008000;"&gt; //The stored pass phrase and the current one do not match&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#008000;"&gt;                //inform about the possibility of use the parameter Force&lt;/span&gt;&lt;br /&gt;                MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "The pass phrase you are providing does not match the existing one."&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "If you want the new pass phrase to become the active pass phrase, use the "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "the parameter Force = 1 when executing this procedure, but be aware that "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;                    "previous encrypted data will become unusable"&lt;/span&gt;;&lt;br /&gt;                SendFeedBackToUser(MessageInCaseOfError);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; void&lt;/span&gt; SendFeedBackToUser(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; errmessage)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#008000;"&gt;        //Console.WriteLine(errmessage);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;        SqlContext&lt;/span&gt;.Pipe.Send(errmessage);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; bool&lt;/span&gt; ReOpenDatabaseMasterKey(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sqlPassPhrase)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; sqlsentence;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; MessageInCaseOfError;&lt;br /&gt;&lt;br /&gt;        sqlsentence =&lt;span style="color:#800000;"&gt; "open master key decryption by password='"&lt;/span&gt; + sqlPassPhrase +&lt;span style="color:#800000;"&gt; "'"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "ALTER MASTER KEY  ADD ENCRYPTION BY  SERVICE MASTER KEY"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "close master key"&lt;/span&gt;;&lt;br /&gt;        MessageInCaseOfError =&lt;span style="color:#800000;"&gt; "The database has a master key that either has not been "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "created by this tool or it has been created with this tool but using "&lt;/span&gt; +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "a different pass phrase.  "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "If you situation is the first case: "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "    - you should recover it from you master key backup. "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "If you situation is the second case: "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "    - Try again providing the correct pass phrase."&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "    OR "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "    - If you want to change the pass phrase (assuming all the content "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "      encrypted with the previous pass phrase will become unavailable)"&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "      you have to: "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "         - Drop asymmetric key k_CEStringProtector executing "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "            drop asymmetric key k_CEStringProtector "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "         - Drop database master key executing "&lt;/span&gt; + CRLF +&lt;br /&gt;&lt;span style="color:#800000;"&gt;            "            drop master key "&lt;/span&gt; + CRLF;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; (ExecuteSQLWithNoResult(sqlsentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt; MessageInCaseOfError) ==&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#008000;"&gt;            //We can not open the master key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        else&lt;/span&gt;&lt;span style="color:#008000;"&gt; //Master key restored&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //executes the sentence received as parameter in the sqlcontext and return the&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //value of first column/first Row in value parameter.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //If ErrorMessage parameter is not empty and an error occures, ErrorMessage&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //and the exception error message are sent to the user&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; bool&lt;/span&gt; ExecuteSQLWithResult(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SQLSentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; int&lt;/span&gt; value,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; ErrorMessage)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; MessageToUser;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;SqlConnection&lt;/span&gt; connection =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; SqlConnection&lt;/span&gt;(&lt;span style="color:#800000;"&gt;"context connection=true"&lt;/span&gt;))&lt;br /&gt;        {&lt;br /&gt;            connection.Open();&lt;br /&gt;&lt;span style="color:#008080;"&gt;            SqlCommand&lt;/span&gt; command =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; SqlCommand&lt;/span&gt;();&lt;br /&gt;&lt;span style="color:#008080;"&gt;            SqlDataReader&lt;/span&gt; reader;&lt;br /&gt;            command.Connection = connection;&lt;br /&gt;&lt;br /&gt;            command.CommandText = SQLSentence;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                reader = command.ExecuteReader();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (reader.HasRows)&lt;br /&gt;                {&lt;br /&gt;                    reader.Read();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                    if&lt;/span&gt; (reader.GetSqlInt32(0).IsNull ==&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;)&lt;br /&gt;                        value = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;) reader.GetSqlInt32(0);&lt;br /&gt;                }&lt;br /&gt;                reader.Close();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            catch&lt;/span&gt; (&lt;span style="color:#008080;"&gt;Exception&lt;/span&gt; e)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (ErrorMessage !=&lt;span style="color:#800000;"&gt; ""&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    MessageToUser = ErrorMessage + CRLF + e.Message;&lt;br /&gt;                    SendFeedBackToUser(MessageToUser);&lt;br /&gt;                }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //executes the sentence received as parameter in the sqlcontext&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //If ErrorMessage parameter is not empty and an error occures, ErrorMessage&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    //and the exception error message are sent to the user&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; bool&lt;/span&gt; ExecuteSQLWithNoResult(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SQLSentence,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; ErrorMessage)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        int&lt;/span&gt; value;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        string&lt;/span&gt; MessageToUser;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        using&lt;/span&gt; (&lt;span style="color:#008080;"&gt;SqlConnection&lt;/span&gt; connection =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; SqlConnection&lt;/span&gt;(&lt;span style="color:#800000;"&gt;"context connection=true"&lt;/span&gt;))&lt;br /&gt;        {&lt;br /&gt;            connection.Open();&lt;br /&gt;&lt;span style="color:#008080;"&gt;            SqlCommand&lt;/span&gt; command =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; SqlCommand&lt;/span&gt;();&lt;br /&gt;&lt;span style="color:#008080;"&gt;            SqlDataReader&lt;/span&gt; reader;&lt;br /&gt;            command.Connection = connection;&lt;br /&gt;&lt;br /&gt;            command.CommandText = SQLSentence;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                reader = command.ExecuteReader();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (reader.HasRows)&lt;br /&gt;                {&lt;br /&gt;                    reader.Read();&lt;br /&gt;                    value = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)reader.GetSqlInt32(0);&lt;br /&gt;                }&lt;br /&gt;                reader.Close();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; true&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            catch&lt;/span&gt; (&lt;span style="color:#008080;"&gt;Exception&lt;/span&gt; e)&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                if&lt;/span&gt; (ErrorMessage !=&lt;span style="color:#800000;"&gt; ""&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    MessageToUser = ErrorMessage + CRLF + e.Message;&lt;br /&gt;                    SendFeedBackToUser(MessageToUser);&lt;br /&gt;                }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; false&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;    // Generate a Key and IV from a passphrase&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    private&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; void&lt;/span&gt; GenerateKEYIV(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PassPhrase,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] Key,&lt;span style="color:#0000ff;"&gt; ref&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; byte&lt;/span&gt;[] IV)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#008080;"&gt;        MD5CryptoServiceProvider&lt;/span&gt; hash =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; MD5CryptoServiceProvider&lt;/span&gt;();&lt;br /&gt;&lt;span style="color:#008080;"&gt;        PasswordDeriveBytes&lt;/span&gt; pdb =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; PasswordDeriveBytes&lt;/span&gt;(PassPhrase,&lt;br /&gt;            hash.ComputeHash(&lt;span style="color:#008080;"&gt;Encoding&lt;/span&gt;.Unicode.GetBytes(PassPhrase)));&lt;br /&gt;&lt;span style="color:#008080;"&gt;        Array&lt;/span&gt;.Copy(pdb.GetBytes(32), Key, 32);&lt;br /&gt;&lt;span style="color:#008080;"&gt;        Array&lt;/span&gt;.Copy(pdb.GetBytes(16), IV, 16);&lt;br /&gt;    }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    public&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; static&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; string&lt;/span&gt; GetHexStringFromBytes(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] bytes)&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color:#008080;"&gt;        StringBuilder&lt;/span&gt; sb =&lt;span style="color:#0000ff;"&gt; new&lt;/span&gt;&lt;span style="color:#008080;"&gt; StringBuilder&lt;/span&gt;(bytes.Length * 2);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        if&lt;/span&gt; ((bytes ==&lt;span style="color:#0000ff;"&gt; null&lt;/span&gt;)   (bytes.Length == 0))&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;        return&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;      for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &lt; bytes.Length; i++)&lt;br /&gt;      {&lt;br /&gt;        sb.Append(bytes[i].ToString(&lt;span style="color:#800000;"&gt;"X2"&lt;/span&gt;));&lt;br /&gt;      }&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;      return&lt;/span&gt; sb.ToString();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;span style="color:#008000;"&gt;&lt;br /&gt;//&lt;br /&gt;//ending of sample code&lt;br /&gt;//&lt;/span&gt;&lt;/div&gt;&lt;div style="DISPLAY: none; BACKGROUND-COLOR: #ffffe6"&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36896703-116256768836671025?l=jcarlossaez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcarlossaez.blogspot.com/feeds/116256768836671025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36896703&amp;postID=116256768836671025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116256768836671025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36896703/posts/default/116256768836671025'/><link rel='alternate' type='text/html' href='http://jcarlossaez.blogspot.com/2006/11/c-code-to-implement-compressed-and.html' title='C# code to implement a compressed and encrypted User Defined Type (UDT) in SQL Server 2005'/><author><name>Juan Carlos</name><uri>http://www.blogger.com/profile/08356875516838829620</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
