Rebex Security
XTS-AES and other handy security classes for .NET
Download 30-day free trial Buy from $99More .NET libraries
-
Rebex SFTP
.NET SFTP client
-
Rebex SSH Shell
.NET SSH Shell
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
XTS-AES Stream
On this page:
Transparent read/write stream decryption/encryption
XtsStream
is a .NET stream that implements XTS-AES, a standard algorithm for protection of stored data defined by IEEE P1619.
An instance XtsStream
wrapped around a Stream
object transparently adds encryption and decryption capabilities to your application:
// open a file stream
var fs = File.Open("data.xts", FileMode.OpenOrCreate);
// create an XTS-AES stream on top of the file stream to add encryption/decryption
var xts = new XtsStream(fs, "secret password");
// use the XTS-AES stream just like you would use the file stream
SaveDataToStream(xts);
' open a file stream
Dim fs = File.Open("data.xts", FileMode.OpenOrCreate)
' create an XTS-AES stream on top of the file stream to add encryption/decryption
Dim xts = New XtsStream(fs, "secret password")
' use the XTS-AES stream just like you would use the file stream
SaveDataToStream(xts)
xts.Close()
Unlike .NET's CryptoStream
, XtsStream
is seekable and both readable/writable. This makes it possible to do this, for example:
// saving or loading?
if (saving)
{
// trim the stream to zero length
xts.SetLength(0);
// save some data to the stream
SaveDataToStream(xts);
}
else
{
// seek to the beginning of the stream
xts.Position = 0;
// load some data from the stream
LoadDataFromStream(xts);
}
xts.Close();
' saving or loading?
If saving Then
' trim the stream to zero length
xts.SetLength(0)
' save some data to the stream
SaveDataToStream(xts)
Else
' seek to the beginning of the stream
xts.Position = 0
' load some data from the stream
LoadDataFromStream(xts)
End If
xts.Close()
See Seeking and random access for more information on seeking, reading and writing.
RSA public/private key cryptography
In addition to password-based encryption, XtsStream
supports asymmetric cryptography as well. This makes it possible to encrypt a file using an public key
and decrypt it using the corresponding private key.
Generating public/private key pairs:
// generate an RSA private key and save it
var privateKey = PrivateKeyInfo.Generate(KeyAlgorithm.RSA, 2048);
privateKey.Save("key.pri", "key password", PrivateKeyFormat.Base64Pkcs8);
// get the corresponding public key and save it
var publicKey = privateKey.GetPublicKey();
publicKey.Save("key.pub"); // no password because it's public
' generate an RSA private key and save it
Dim privateKey As PrivateKeyInfo = PrivateKeyInfo.Generate(KeyAlgorithm.RSA, 2048)
privateKey.Save("key.pri", "key password", PrivateKeyFormat.Base64Pkcs8)
' get the corresponding public key and save it
Dim publicKey As PublicKeyInfo = privateKey.GetPublicKey()
publicKey.Save("key.pub") ' no password because it's public
Encrypting data using a public key:
// load the public key
var publicKey = new PublicKeyInfo();
publicKey.Load("key.pub");
// save text into a file ecnrypted using the public key
using (var writer = new StreamWriter(new XtsStream(File.Create("data.xts"), publicKey)))
{
writer.WriteLine("This file has been encrypted using an RSA public key.");
writer.WriteLine("More data...");
}
' load the public key
Dim publicKey As New PublicKeyInfo()
publicKey.Load("key.pub")
' save text into a file ecnrypted using the public key
Using writer As New StreamWriter(New XtsStream(File.Create("data.xts"), publicKey))
writer.WriteLine("This file has been encrypted using an RSA public key.")
writer.WriteLine("More data...")
End Using
Decrypting data using a private key:
// load the private key
var privateKey = new PrivateKeyInfo();
privateKey.Load("key.pri", "key password");
// read text from a file decrypted using a private key
using (var reader = new StreamReader(new XtsStream(File.OpenRead("data.xts"), privateKey)))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
' load the private key
Dim privateKey As New PrivateKeyInfo()
privateKey.Load("key.pri", "key password")
' read text from a file decrypted using a private key
Using reader As New StreamReader(New XtsStream(File.OpenRead("data.xts"), privateKey))
While True
Dim line As String = reader.ReadLine()
If line = Nothing Then Exit While
Console.WriteLine(line)
End While
End Using
Integrates easily with existing applications
XtsStream
is a .NET Stream
that transparently adds encryption/decryption support to other Stream
objects, which makes
it simple to integrate it with existing applications and .NET objects that use streams.
For example, if your application loads and saves XML documents using .NET's XmlDocument
, adding XtsStream
is all you need to store
the XML files securely. The following code saves (encrypts) an XML document into an encrypted file:
// open a file stream
Stream output = File.Create("list.xts");
// create an XTS-AES stream on top of the file stream to add encryption/decryption
output = new XtsStream(output, "secret password");
// construct a XML document
var xml = new XmlDocument();
var list = xml.CreateElement("list");
xml.AppendChild(list);
XmlElement item;
item = xml.CreateElement("item"); item.InnerText = "Rebex Security"; list.AppendChild(item);
item = xml.CreateElement("item"); item.InnerText = "Rebex SFTP"; list.AppendChild(item);
item = xml.CreateElement("item"); item.InnerText = "Rebex FTP/SSL"; list.AppendChild(item);
// save the XML document into an encrypted stream
xml.Save(output);
// close the streams
output.Close();
' open a file stream
Dim output As Stream = File.Create("list.xts")
' create an XTS-AES stream on top of the file stream to add encryption/decryption
output = New XtsStream(output, "secret password")
' construct a XML document
Dim xml = New XmlDocument()
Dim list = xml.CreateElement("list")
xml.AppendChild(list)
Dim item As XmlElement
item = xml.CreateElement("item")
item.InnerText = "Rebex Security"
list.AppendChild(item)
item = xml.CreateElement("item")
item.InnerText = "Rebex SFTP"
list.AppendChild(item)
item = xml.CreateElement("item")
item.InnerText = "Rebex FTP/SSL"
list.AppendChild(item)
' save the XML document into an encrypted stream
xml.Save(output)
' close the streams
output.Close()
As you can see, adding a single line of code (the one with XtsStream
constructor) was the only change needed to add encryption support!
Loading (decrypting) the encrypted XML document is just as simple:
// open a file stream
Stream input = File.OpenRead("list.xts");
// create an XTS-AES stream on top of the file stream to add encryption/decryption
input = new XtsStream(input, "secret password");
// load a XML document from the encrypted stream
var xml = new XmlDocument();
xml.Load(input);
// display the XML document
Console.WriteLine(xml.InnerXml);
// close the stream
input.Close();
' open a file stream
Dim input As Stream = File.OpenRead("list.xts")
' create an XTS-AES stream on top of the file stream to add encryption/decryption
input = New XtsStream(input, "secret password")
' load a XML document from the encrypted stream
Dim xml = New XmlDocument()
xml.Load(input)
' display the XML document
Console.WriteLine(xml.InnerXml)
' close the stream
input.Close()
Again, adding a single line of code was the only change needed.
To convert existing unencrypted files or streams to a format supported by XtsStream
,
use FileEncryption
object
with EncryptionAlgorithm
set to AesXts
.
Writing to an encrypted stream
XtsStream
makes it possible to easily add strong encryption support to existing applications that are already stream-based
- just wrap an instance of XtsStream
around your stream.
The following code demonstrates this by creating an encrypted log file:
// open a file stream
var fs = File.Open("log.xts", FileMode.OpenOrCreate);
// create an XTS-AES stream on top of the file stream to add encryption/decryption
var xts = new XtsStream(fs, "secret password");
// seek to an end of the stream (we will append data to its end)
xts.Seek(0, SeekOrigin.End);
// create a stream writer on top of the encrypted stream
var writer = new StreamWriter(xts, Encoding.UTF8);
// log some messages
writer.WriteLine("Encrypted log file is accessible now.");
writer.WriteLine("Machine name: {0}", Environment.MachineName);
writer.WriteLine("Current time is: {0}", DateTime.Now);
writer.WriteLine(message);
// flush the writer to make sure all changes were saved
// (or use writer.AutoFlush if preferred)
writer.Flush();
// close the writer and underlying streams
writer.Close();
' open a file stream
Dim fs = File.Open("log.xts", FileMode.OpenOrCreate)
' create an XTS-AES stream on top of the file stream to add encryption/decryption
Dim xts = New XtsStream(fs, "secret password")
' seek to an end of the stream (we will append data to its end)
xts.Seek(0, SeekOrigin.[End])
' create a stream writer on top of the encrypted stream
Dim writer = New StreamWriter(xts, Encoding.UTF8)
' log some messages
writer.WriteLine("Encrypted log file is accessible now.")
writer.WriteLine("Machine name: {0}", Environment.MachineName)
writer.WriteLine("Current time is: {0}", DateTime.Now)
writer.WriteLine(message)
' flush the writer to make sure all changes were saved
' (or use writer.AutoFlush if preferred)
writer.Flush()
' close the writer and underlying streams
writer.Close()
To decrypt the log, simply read from the XtsStream
.
To convert existing unencrypted files or streams to a format supported by XtsStream
,
use FileEncryption
object
with EncryptionAlgorithm
set to AesXts
.
Reading from an encrypted stream
Reading data from an encrypted XtsStream
is simple:
// open a file stream
var fs = File.Open("log.xts", FileMode.OpenOrCreate);
// create an XTS-AES stream on top of the file stream to add encryption/decryption
var xts = new XtsStream(fs, "secret password");
// create a stream reader on top of the encrypted stream
var reader = new StreamReader(xts, Encoding.UTF8);
for (; ; )
{
// read a line from the encrypted log
string line = reader.ReadLine();
// exit the loop when end-of-file reached
if (line == null)
break;
// display the line otherwise
Console.WriteLine(line);
}
// close the reader and underlying streams
reader.Close();
' open a file stream
Dim fs = File.Open("log.xts", FileMode.OpenOrCreate)
' create an XTS-AES stream on top of the file stream to add encryption/decryption
Dim xts = New XtsStream(fs, "secret password")
' create a stream reader on top of the encrypted stream
Dim reader = New StreamReader(xts, Encoding.UTF8)
While True
' read a line from the encrypted log
Dim line As String = reader.ReadLine()
' exit the loop when end-of-file reached
If line Is Nothing Then
Exit While
End If
' display the line otherwise
Console.WriteLine(line)
End While
' close the reader and underlying streams
reader.Close()
Alternatively, use FileEncryption
object to decrypt the file easily:
// create an encryption/decryption object
var encryptor = new FileEncryption();
// specify password
encryptor.SetPassword("secret password");
// decrypt a file
encryptor.Decrypt("log.xts", "log.txt");
' create an encryption/decryption object
Dim encryptor = New FileEncryption()
' specify password
encryptor.SetPassword("secret password")
' decrypt a file
encryptor.Decrypt("log.xts", "log.txt")
Seeking and random access
XtsStream
is seekable - it support nonsequential, or random, access to a stream's contents. In fact, it works just like a FileStream
, but adds transparent encryption/decryption
support on top of that. Unlike .NET's CryptoStream
, XtsStream
supports Seek
method, Position
property. It also supports both Read
and Write
.
To access stream data randomly, just seek to a particular location and read from or write to it:
// open a file stream
var fs = File.Open("file.xts", FileMode.OpenOrCreate);
// create an XTS-AES stream on top of the file stream to add encryption/decryption
var xts = new XtsStream(fs, "secret password");
// seek anywhere in the file
xts.Seek(100000, SeekOrigin.Begin);
// read data from the current position
xts.Read(buffer, 0, 500);
// write something there
xts.Write(buffer, 0, 300);
// seek somewhere else
xts.Seek(-100, SeekOrigin.End);
// write something there
xts.Write(buffer, 0, 200);
// position works as well
xts.Position = 400;
// read some data
xts.Read(buffer, 0, 100);
// close the stream
xts.Close();
' open a file stream
fs = File.Open("file.xts", FileMode.OpenOrCreate)
' create an XTS-AES stream on top of the file stream to add encryption/decryption
xts = New XtsStream(fs, "secret password")
' seek anywhere in the file
xts.Seek(100000, SeekOrigin.Begin)
' read data from the current position
xts.Read(buffer, 0, 500)
' write something there
xts.Write(buffer, 0, 300)
' seek somewhere else
xts.Seek(-100, SeekOrigin.[End])
' write something there
xts.Write(buffer, 0, 200)
' position works as well
xts.Position = 400
' read some data
xts.Read(buffer, 0, 100)
' close the stream
xts.Close()
Back to feature list...