Skip to content

Instantly share code, notes, and snippets.

@sancarn
Last active February 5, 2018 10:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sancarn/266a50be4681d878006223116e0dfa52 to your computer and use it in GitHub Desktop.
Save sancarn/266a50be4681d878006223116e0dfa52 to your computer and use it in GitHub Desktop.
Article to transfer to linkedin

Encryption in InfoWorks ICM using Ruby

What is Encryption?

Over the past few months I have been spending a large amount of time wondering how to encrypt data using Ruby, in InfoWorks ICM. For those who don't know, encryption refers to the process of transforming sensitive data into an unreadable form where it is unlikely to be intercepted by unauthorized viewers.

Note: Encryption does have other uses, for example, file modification prevention and software signing.

From the description above you might be able to see why encryption is so important, especially when handling sensitive client data. In hydraulic modelling this is often overlooked. However if the results or comments inside a hydraulic model became public, clients may be put in an uncomfortable position. Of course, as professionals this is something that we would like to avoid at all costs.

OpenSSL and Ruby

Typically most Ruby runtime environments have access to the OpenSSL library. OpenSSL is a robust, commercial-grade, and full-featured toolkit for data security especialyl over the internet. OpenSSL provides methods for both encrypting and decrypting data. Most encryption libraries for Ruby build off of the cryptographic services that the OpenSSL library provides.

To encrypt data with OpenSSL, you can run the following code:

require 'openssl'
cipher = OpenSSL::Cipher::AES.new(128, :CBC) #new(keylength,cipherMode)
cipher.encrypt
key = cipher.random_key #16 bytes for 128-bit keylength, 32 for 256-bit keylength
iv = cipher.random_iv   #16 bytes no matter of keylength

#Now let's encrypt some data!
data = "super secure data"
encrypted = cipher.update(data) + cipher.final
p encrypted #secured data

Later we can decrypt the data like so:

decipher = OpenSSL::Cipher::AES.new(128, :CBC)
decipher.decrypt
decipher.key = key
decipher.iv = iv

#Decrypt the data
plain = decipher.update(encrypted) + decipher.final
puts plain #the decrypted text

A full example is available here.

Great! So now we know how to encrypt and decrypt data with Ruby's library OpenSSL. That's great! Or at least it would be if ICM supported OpenSSL. As of the current version of InfoWorks ICM v8, OpenSSL isn't supported by ICM's embedded version of Ruby... So. this begs the question, what can we use instead?

Simple! We use the Microsoft .NET Framework!

What is Microsoft .NET Framework?

In a nutshell, the Microsoft .NET framework is a series of object oriented libraries specific for building applications on Windows (Note: some libraries are cross platform). You will normally be able to find common algorithms, such as ones for encryption, somewhere within the .NET framework.

Using .NET classes via WIN32OLE

A certain subset of .NET classes are exposed to COM/OLE. We can access these classes and use them to augment Ruby's functionality using the WIN32OLE class. A full list of .NET classes exposed to COM/OLE on my pc can be found here. Note: This may depend on the version of .NET installed on your machine.

To actually use a .NET class in Ruby, we can instantiate it with WIN32OLE.new method. For example, here we instantiate the System.Text.UTF8Encoding .NET class:

require 'win32ole'
utf8 = WIN32OLE.new("System.Text.UTF8Encoding")
puts utf8.GetByteCount_2("hello world")  #_2 is the 2nd version of GetByteCount which has a single paramater (Character array)  See: https://msdn.microsoft.com/en-us/library/z2s2h516(v=vs.110).aspx

#=> 11

In some cases, like in the case of using the encryption libraries, we need to use arrays of a certain data type. In the above example we had to use an array of characters, which is simply what a String is. However this was ultimately a fluke on Ruby's behalf. In the example of the encryption libraries, we have to pass byte array In this example it is often better to use the variant datatype:

#Syntax:
#WIN32OLE_VARIANT.new([x,y,z],type)

#Example: a 3x3x3 matrix of booleans
mat1 = WIN32OLE_VARIANT.array([3,3,3],WIN32OLE::VARIANT::VT_BOOL)

#Example a 2x6 matrix of ints
mat2 = WIN32OLE_VARIANT.array([2,6],WIN32OLE::VARIANT::VT_INT)

#Example an array of 8 strings:
arr1 = WIN32OLE_VARIANT.array([8],WIN32OLE::VARIANT::VT_BSTR)

After creating the array you can fill it with data:

arr = ["a","b","c","d","e","f","g","h"]
oleArr = WIN32OLE_VARIANT.array([8],WIN32OLE::VARIANT::VT_BSTR)
arr.each_with_index { |val,ind|  oleArr[ind]=val}

Encryption in ICM

One of the classes provided by the .NET framework is the System.Security.Cryptography.TripleDESCryptoServiceProvider class. This class can be instantiated with COM/OLE to encrypt data on demand. First let's look at a C#.NET example of how to use the library:

    string data = "Please encyrpt me"
    byte[] dataArray = UTF8Encoding.UTF8.GetBytes(data);
    
    string key = "My amazing key?!" //Key to be a maximum of 16 bytes!
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key)
    
    string iv = "a7bv!ad-" //Salt - always 8 bytes
    byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv)
    
    //Encrypt
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.key = keyArray
    tdes.iv = ivArray
    byte[] aEncrypted = tdes.CreateEncryptor().TransformFinalBlock(dataArray,0,dataArray.Length)
    
    Console.write(Convert.ToBase64String(resultArray,0,aEncrypted.Length))
    
    //Decrypt
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.key = keyArray
    tdes.iv = ivArray
    byte[] aDecrypted = tdes.CreateDecryptor().TransformFinalBlock(aEncrypted,0,aEncrypted.Length)
    
    Console.Write(UTF8Encoding.UTF8.GetString(aDecrypted))

In ruby, the process of encrypting and decrypting data is basically the same, but with a few caviats. For example, I had to create a special class ByteArray to transfer the data to in a form that .NET wouldn't complain about... But other than that, it's just the same recycled code:

require 'win32ole'
require 'base64'
class ByteArray
    attr_reader :root, :length, :value
    def initialize(arr)
        @root = arr
        @length = arr.length
        vArr = WIN32OLE_VARIANT.array([arr.length],WIN32OLE::VARIANT::VT_UI1)
        arr.each_with_index {|value,index| vArr[index]=value}
        @value = vArr
    end
end


data = "Please encyrpt me"
oData = ByteArray.new(data.each_byte.to_a)

key = "My amazing key?!" #Key to be a maximum of 16 bytes!
oKey = ByteArray.new(key.each_byte.to_a)
    
iv = "a7bv!ad-"          #Salt - always 8 bytes
oiv = ByteArray.new(iv.each_byte.to_a)

#Encrypted
crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
crypto.key = oKey.value
crypto.iv = oiv
aEncrypted = crypto.CreateEncryptor.TransformFinalBlock(oData.value,0,oData.length)

#Print encrypted data
p aEncrypted.map {|x| x.chr}.join

#Decrypt data
oEncrypted  = ByteArray.new(aEncrypted)
aDecrypted = crypto.CreateDecryptor.TransformFinalBlock(oEncrypted.value,0,oEncrypted.length)

#Print decrypted data
puts aDecrypted.map {|x| x.chr}.join

Now of course the above is a bit long winded, so to make it easier I created a Crypt class:

require 'base64'
require 'win32ole'
require 'digest'

class ByteArray
	attr_reader :root, :length, :value
	def initialize(arr)
		@root = arr
		@length = arr.length
		vArr = WIN32OLE_VARIANT.array([arr.length],WIN32OLE::VARIANT::VT_UI1)
		arr.each_with_index {|value,index| vArr[index]=value}
		@value = vArr
	end
end

#Use .NET libraries to encrypt/decrypt data
class Crypt
	attr_accessor :crypto
	def initialize(key,iv = "#a7B-!a@")
		key = Digest::MD5.digest(key)	#MD5 ensures that key is always 16 characters long
		@sKey = key
		@sIV = iv
		@crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
		@crypto.key = ByteArray.new(key.each_byte.to_a).value
		@crypto.iv  = ByteArray.new(iv.each_byte.to_a).value
	end
	
	def encrypt(sData)
		aToEncrypt = sData.each_byte.to_a
		toEncrypt  = ByteArray.new(aToEncrypt)
		aEncrypted = @crypto.CreateEncryptor.TransformFinalBlock(toEncrypt.value, 0, toEncrypt.length)
		#aEncrypted = @crypto.CreateEncryptor.TransformFinalBlock(sData, 0, sData.length + 1)
		return Base64.encode64(aEncrypted)
	end
	
	def decrypt(sData)
		aToDecrypt = Base64.decode64(sData).each_byte.to_a
		toDecrypt  = ByteArray.new(aToDecrypt)
		aDecrypted = @crypto.CreateDecryptor.TransformFinalBlock(toDecrypt.value, 0, toDecrypt.length)
		return aDecrypted.map {|x| x.chr}.join
	end
end

Using the above class we can now easily encrypt and decrypt data:

require 'Crypt.rb'
crypt = Crypt.new("My awesome key that can be any number of characters long!")
data = crypt.encrypt("Hello world)
puts data
puts crypt.decrypt(data)

Example use cases of this technology

  • Encrypting/Decrypting text data in a model, e.g. Comments and user text data.
  • Encrypting/Decrypting files, for example simulation results/reports.

Encrypting comments example

As a brief example I thought I would quickly write some code to encrypt the comments of a model. It has to be said that this algorithm is still not perfect, as each comment is encrypted individually. Therefore all comments which are the same will have the same cypher text. Of course, this won't tell them "what it means", but it still gives someone information about it...

crypt = Crypt.new("my-not-so-amazing-password")
net = WSApplication.current_network
net.transaction_begin
  net.each do |obj|
    if obj.responds_to? :comment
      if obj.comment != ""
        obj.comment = crypt.encrypt(obj.comment)
        obj.write
      end
    end
  end
net.transaction_commit

And to decrypt again:

crypt = Crypt.new("my-not-so-amazing-password")
net = WSApplication.current_network
net.transaction_begin
  net.each do |obj|
    if obj.responds_to? :comment
      if obj.comment != ""
        obj.comment = crypt.decrypt(obj.comment)
        obj.write
      end
    end
  end
net.transaction_commit

Special thanks

Special thanks to:

Disclaimer

Due to the nature of this operation data can be completely destroyed if the algorithms are used by people who do not know what they are doing. Before testing any of the algorithms make sure to make a back up!

ALL CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

require 'base64'
require 'win32ole'
require 'digest'
class ByteArray
attr_reader :root, :length, :value
def initialize(arr)
@root = arr
@length = arr.length
vArr = WIN32OLE_VARIANT.array([arr.length],WIN32OLE::VARIANT::VT_UI1)
arr.each_with_index {|value,index| vArr[index]=value}
@value = vArr
end
end
#Use .NET libraries to encrypt/decrypt data
class Crypt
attr_accessor :crypto
def initialize(key,iv = "#a7B-!a@")
key = Digest::MD5.digest(key) #MD5 ensures that key is always 16 characters long
@sKey = key
@sIV = iv
@crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
@crypto.key = ByteArray.new(key.each_byte.to_a).value
@crypto.iv = ByteArray.new(iv.each_byte.to_a).value
end
def encrypt(sData)
aToEncrypt = sData.each_byte.to_a
toEncrypt = ByteArray.new(aToEncrypt)
aEncrypted = @crypto.CreateEncryptor.TransformFinalBlock(toEncrypt.value, 0, toEncrypt.length)
#aEncrypted = @crypto.CreateEncryptor.TransformFinalBlock(sData, 0, sData.length + 1)
return Base64.encode64(aEncrypted)
end
def decrypt(sData)
aToDecrypt = Base64.decode64(sData).each_byte.to_a
toDecrypt = ByteArray.new(aToDecrypt)
aDecrypted = @crypto.CreateDecryptor.TransformFinalBlock(toDecrypt.value, 0, toDecrypt.length)
return aDecrypted.map {|x| x.chr}.join
end
end

To obtain this list I ran the following powershell script:

dir  REGISTRY::HKEY_CLASSES_ROOT\CLSID -include PROGID -recurse | foreach {$_.GetValue()}

This only displayes objects which have a PROGID however, there are many objects available which are instantiatable, but do not have a PROGID, but a GUID instead. A better way of getting instantiatable objects is using OLE/COM Object Viewer


System.AccessViolationException
System.AppDomainManager
System.AppDomainSetup
System.AppDomainUnloadedException
System.ApplicationException
System.ArgumentException
System.ArgumentNullException
System.ArgumentOutOfRangeException
System.ArithmeticException
System.ArrayTypeMismatchException
System.BadImageFormatException
System.CannotUnloadAppDomainException
System.Collections.ArrayList
System.Collections.CaseInsensitiveComparer
System.Collections.CaseInsensitiveHashCodeProvider
System.Collections.Generic.KeyNotFoundException
System.Collections.Hashtable
System.Collections.Queue
System.Collections.SortedList
System.Collections.Stack
System.ContextMarshalException
System.ContextStaticAttribute
System.Data.SqlClient.SQLDebugging
System.DataMisalignedException
System.Diagnostics.Debugger
System.Diagnostics.DebuggerHiddenAttribute
System.Diagnostics.DebuggerNonUserCodeAttribute
System.Diagnostics.DebuggerStepperBoundaryAttribute
System.Diagnostics.DebuggerStepThroughAttribute
System.Diagnostics.StackFrame
System.Diagnostics.StackTrace
System.Diagnostics.SymbolStore.SymDocumentType
System.Diagnostics.SymbolStore.SymLanguageType
System.Diagnostics.SymbolStore.SymLanguageVendor
System.DivideByZeroException
System.DllNotFoundException
System.DuplicateWaitObjectException
System.EnterpriseServices.CompensatingResourceManager.ClerkMonitor
System.EnterpriseServices.CompensatingResourceManager.Compensator
System.EnterpriseServices.Internal.AppDomainHelper
System.EnterpriseServices.Internal.AssemblyLocator
System.EnterpriseServices.Internal.ClientRemotingConfig
System.EnterpriseServices.Internal.ClrObjectFactory
System.EnterpriseServices.Internal.ComManagedImportUtil
System.EnterpriseServices.Internal.ComSoapPublishError
System.EnterpriseServices.Internal.GenerateMetadata
System.EnterpriseServices.Internal.IISVirtualRoot
System.EnterpriseServices.Internal.Publish
System.EnterpriseServices.Internal.ServerWebConfig
System.EnterpriseServices.Internal.SoapClientImport
System.EnterpriseServices.Internal.SoapServerTlb
System.EnterpriseServices.Internal.SoapServerVRoot
System.EnterpriseServices.Internal.SoapUtility
System.EnterpriseServices.RegistrationConfig
System.EnterpriseServices.RegistrationHelper
System.EnterpriseServices.RegistrationHelperTx
System.EnterpriseServices.RegistrationHelperTx
System.EntryPointNotFoundException
System.EventArgs
System.Exception
System.ExecutionEngineException
System.FieldAccessException
System.FlagsAttribute
System.FormatException
System.Globalization.DateTimeFormatInfo
System.Globalization.GregorianCalendar
System.Globalization.HebrewCalendar
System.Globalization.HijriCalendar
System.Globalization.JapaneseCalendar
System.Globalization.JulianCalendar
System.Globalization.KoreanCalendar
System.Globalization.NumberFormatInfo
System.Globalization.StringInfo
System.Globalization.TaiwanCalendar
System.Globalization.ThaiBuddhistCalendar
System.IndexOutOfRangeException
System.InvalidCastException
System.InvalidOperationException
System.InvalidProgramException
System.IO.DirectoryNotFoundException
System.IO.DriveNotFoundException
System.IO.EndOfStreamException
System.IO.FileLoadException
System.IO.FileNotFoundException
System.IO.IOException
System.IO.IsolatedStorage.IsolatedStorageException
System.IO.MemoryStream
System.IO.PathTooLongException
System.IO.StringWriter
System.MemberAccessException
System.MethodAccessException
System.MissingFieldException
System.MissingMemberException
System.MissingMethodException
System.MTAThreadAttribute
System.MulticastNotSupportedException
System.NonSerializedAttribute
System.NotFiniteNumberException
System.NotImplementedException
System.NotSupportedException
System.NullReferenceException
System.Object
System.ObsoleteAttribute
System.OperationCanceledException
System.OutOfMemoryException
System.OverflowException
System.ParamArrayAttribute
System.PlatformNotSupportedException
System.Random
System.RankException
System.Reflection.AmbiguousMatchException
System.Reflection.AssemblyName
System.Reflection.AssemblyNameProxy
System.Reflection.CustomAttributeFormatException
System.Reflection.InvalidFilterCriteriaException
System.Reflection.ObfuscationAttribute
System.Reflection.TargetException
System.Reflection.TargetParameterCountException
System.Resources.MissingManifestResourceException
System.Resources.MissingSatelliteAssemblyException
System.Runtime.CompilerServices.CallConvCdecl
System.Runtime.CompilerServices.CallConvFastcall
System.Runtime.CompilerServices.CallConvStdcall
System.Runtime.CompilerServices.CallConvThiscall
System.Runtime.CompilerServices.CompilerGlobalScopeAttribute
System.Runtime.CompilerServices.DiscardableAttribute
System.Runtime.CompilerServices.IDispatchConstantAttribute
System.Runtime.CompilerServices.IUnknownConstantAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.NativeCppClassAttribute
System.Runtime.Hosting.ApplicationActivator
System.Runtime.InteropServices.ComConversionLossAttribute
System.Runtime.InteropServices.COMException
System.Runtime.InteropServices.ComImportAttribute
System.Runtime.InteropServices.ComRegisterFunctionAttribute
System.Runtime.InteropServices.ComUnregisterFunctionAttribute
System.Runtime.InteropServices.ExternalException
System.Runtime.InteropServices.InAttribute
System.Runtime.InteropServices.InvalidComObjectException
System.Runtime.InteropServices.InvalidOleVariantTypeException
System.Runtime.InteropServices.MarshalDirectiveException
System.Runtime.InteropServices.OptionalAttribute
System.Runtime.InteropServices.OutAttribute
System.Runtime.InteropServices.PreserveSigAttribute
System.Runtime.InteropServices.RegistrationServices
System.Runtime.InteropServices.RuntimeEnvironment
System.Runtime.InteropServices.SafeArrayRankMismatchException
System.Runtime.InteropServices.SafeArrayTypeMismatchException
System.Runtime.InteropServices.SEHException
System.Runtime.InteropServices.SetWin32ContextInIDispatchAttribute
System.Runtime.InteropServices.TypeLibConverter
System.Runtime.Remoting.Channels.ClientChannelSinkStack
System.Runtime.Remoting.Channels.ServerChannelSinkStack
System.Runtime.Remoting.Channels.TransportHeaders
System.Runtime.Remoting.Contexts.Context
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.Remoting.InternalRemotingServices
System.Runtime.Remoting.Lifetime.ClientSponsor
System.Runtime.Remoting.Lifetime.LifetimeServices
System.Runtime.Remoting.Messaging.OneWayAttribute
System.Runtime.Remoting.Messaging.RemotingSurrogateSelector
System.Runtime.Remoting.Metadata.SoapAttribute
System.Runtime.Remoting.Metadata.SoapFieldAttribute
System.Runtime.Remoting.Metadata.SoapMethodAttribute
System.Runtime.Remoting.Metadata.SoapParameterAttribute
System.Runtime.Remoting.Metadata.SoapTypeAttribute
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapAnyUri
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDate
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDateTime
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDay
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDuration
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapEntities
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapEntity
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapId
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapIdref
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapIdrefs
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapInteger
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapLanguage
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapMonth
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapMonthDay
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapName
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNcName
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNegativeInteger
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNmtoken
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNmtokens
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNonNegativeInteger
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNonPositiveInteger
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNormalizedString
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNotation
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapPositiveInteger
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapQName
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapTime
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapToken
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYear
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYearMonth
System.Runtime.Remoting.ObjRef
System.Runtime.Remoting.Proxies.ProxyAttribute
System.Runtime.Remoting.RemotingException
System.Runtime.Remoting.RemotingTimeoutException
System.Runtime.Remoting.ServerException
System.Runtime.Remoting.Services.EnterpriseServicesHelper
System.Runtime.Remoting.Services.TrackingServices
System.Runtime.Serialization.FormatterConverter
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
System.Runtime.Serialization.Formatters.InternalRM
System.Runtime.Serialization.Formatters.SoapFault
System.Runtime.Serialization.Formatters.SoapMessage
System.Runtime.Serialization.ObjectIDGenerator
System.Runtime.Serialization.OnDeserializedAttribute
System.Runtime.Serialization.OnDeserializingAttribute
System.Runtime.Serialization.OnSerializedAttribute
System.Runtime.Serialization.OnSerializingAttribute
System.Runtime.Serialization.OptionalFieldAttribute
System.Runtime.Serialization.SerializationException
System.Runtime.Serialization.SurrogateSelector
System.Security.AllowPartiallyTrustedCallersAttribute
System.Security.Cryptography.CryptoConfig
System.Security.Cryptography.CryptographicException
System.Security.Cryptography.CryptographicUnexpectedOperationException
System.Security.Cryptography.CspParameters
System.Security.Cryptography.DESCryptoServiceProvider
System.Security.Cryptography.DSACryptoServiceProvider
System.Security.Cryptography.DSASignatureDeformatter
System.Security.Cryptography.DSASignatureFormatter
System.Security.Cryptography.FromBase64Transform
System.Security.Cryptography.HMACMD5
System.Security.Cryptography.HMACRIPEMD160
System.Security.Cryptography.HMACSHA1
System.Security.Cryptography.HMACSHA256
System.Security.Cryptography.HMACSHA384
System.Security.Cryptography.HMACSHA512
System.Security.Cryptography.MACTripleDES
System.Security.Cryptography.MD5CryptoServiceProvider
System.Security.Cryptography.PKCS1MaskGenerationMethod
System.Security.Cryptography.RC2CryptoServiceProvider
System.Security.Cryptography.RijndaelManaged
System.Security.Cryptography.RIPEMD160Managed
System.Security.Cryptography.RNGCryptoServiceProvider
System.Security.Cryptography.RSACryptoServiceProvider
System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter
System.Security.Cryptography.RSAOAEPKeyExchangeFormatter
System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter
System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter
System.Security.Cryptography.RSAPKCS1SignatureDeformatter
System.Security.Cryptography.RSAPKCS1SignatureFormatter
System.Security.Cryptography.SHA1CryptoServiceProvider
System.Security.Cryptography.SHA1Managed
System.Security.Cryptography.SHA256Managed
System.Security.Cryptography.SHA384Managed
System.Security.Cryptography.SHA512Managed
System.Security.Cryptography.SignatureDescription
System.Security.Cryptography.ToBase64Transform
System.Security.Cryptography.TripleDESCryptoServiceProvider
System.Security.Cryptography.X509Certificates.X509Certificate
System.Security.HostProtectionException
System.Security.HostSecurityManager
System.Security.Permissions.GacIdentityPermission
System.Security.Permissions.HostProtectionAttribute
System.Security.Policy.AllMembershipCondition
System.Security.Policy.ApplicationDirectoryMembershipCondition
System.Security.Policy.ApplicationTrust
System.Security.Policy.Evidence
System.Security.Policy.GacInstalled
System.Security.Policy.GacMembershipCondition
System.Security.Policy.PolicyException
System.Security.Policy.TrustManagerContext
System.Security.SecurityException
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
System.Security.VerificationException
System.Security.XmlSyntaxException
System.SerializableAttribute
System.StackOverflowException
System.STAThreadAttribute
System.SystemException
System.Text.ASCIIEncoding
System.Text.StringBuilder
System.Text.UnicodeEncoding
System.Text.UTF7Encoding
System.Text.UTF8Encoding
System.Threading.Mutex
System.Threading.Overlapped
System.Threading.ReaderWriterLock
System.Threading.SynchronizationLockException
System.Threading.ThreadInterruptedException
System.Threading.ThreadStateException
System.ThreadStaticAttribute
System.TimeoutException
System.TypeLoadException
System.TypeUnloadedException
System.UnauthorizedAccessException
System.Version
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment