Encrypt and decrypt string with DotNet


#1

Hi everyone!
In order to avoid “necro-posting” I prefer to open a new topic here about encryption and decryption of strings.
I’d like to encrypt a text password that should be saved in a INI file.
After looking around I’ve found this old post
Cross platform encryption/decryption (text) with maxscript
That seems to be similar to another article here
YOU CAN DO IT! VFX

I’ve taken the Encrypt function and it works: since I’m not very into security stuff and never really used DotNet, I tried to compare the script with this C# example to understand the code and be able to use and rewrite it:
System_Security_Cryptography_Rijndael_Create

So I tried to write my decrypt function but I’m stuck… I see that the first part could be almost the same lines but I get an error when trying to read from the stream. The object exists, but I get this Runtime error: .NET runtime exception: Object reference not set to an instance of an object. when evaluating ms.
I’m probably missing something very easy, but I admit I’m in trouble :blush:
Maybe some of you could point me in the right direction…
My function is this:


fn decryptText cipherText tKey: tIV: =
(
	plaintext = ""

	dnConvert = dotnetClass "System.Convert"
	dnUTF8 = dotNetObject "System.Text.UTF8Encoding"
	algorithm = (dotnetClass "System.Security.Cryptography.SymmetricAlgorithm").Create()
	algorithm.key = (DotnetObject "System.Text.UTF8Encoding").GetBytes tKey
	algorithm.IV = (DotnetObject "System.Text.UTF8Encoding").GetBytes tIV
	
	cipherBytes = dnUTF8.GetBytes cipherText
	
	memStream = dotnetObject "System.IO.MemoryStream"
	cStreamMode = (dotnetClass "System.Security.Cryptography.CryptoStreamMode")
	
	cStreamTransform = algorithm.CreateDecryptor algorithm.key algorithm.IV

	cStream = dotnetObject "System.Security.Cryptography.CryptoStream" memStream cStreamTransform cStreamMode.Read
	
	print cStream --Just for debugging... It exists!
	
	/* ERROR HERE!!! --> */ cStream.Read cipherBytes 0 cipherBytes.count

	plaintext = memStream.ToString()			
	memStream.Close()
	cStream.Close()
	dnConvert.ToBase64String plaintext
)

Many, many thanks!!! :slight_smile:


#2

fn decryptText cipherText tKey: tIV: =
(
–plaintext = “”

dnConvert = dotnetClass "System.Convert"
dnUTF8 = dotNetObject "System.Text.UTF8Encoding"
algorithm = (dotnetClass "System.Security.Cryptography.SymmetricAlgorithm").Create()
algorithm.key = (DotnetObject "System.Text.UTF8Encoding").GetBytes tKey
algorithm.IV = (DotnetObject "System.Text.UTF8Encoding").GetBytes tIV
cipherBytes = dnConvert.FromBase64String cipherText
--cipherBytes = dnUTF8.GetBytes cipherText

memStream = dotnetObject "System.IO.MemoryStream"
cStreamMode = (dotnetClass "System.Security.Cryptography.CryptoStreamMode")

cStreamTransform = algorithm.CreateDecryptor algorithm.key algorithm.IV

cStream = dotnetObject "System.Security.Cryptography.CryptoStream" memStream cStreamTransform cStreamMode.Write--Read
/* ERROR HERE!!! --> */ 
--cStream.Read cipherBytes 0 cipherBytes.count
cStream.Write cipherBytes 0 cipherBytes.count
cStream.FlushFinalBlock()
plaintext = memStream.ToArray()            
memStream.Close()
cStream.Close()
--dnConvert.ToBase64String plaintext
dnUTF8.GetString plaintext

)

decryptText “JSkhLYfOlYEFQ/QnYrr8DQ==” tKey:“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa” tIV:“bbbbbbbbbbbbbbbb”


#3

… deleted


#4

Thanks bud!!
This worked like a charm!!
I had lost hope in some answer after such a long time! :grin: