Imports System.Text Imports System.Security.Cryptography Private Const CRYPT_MODE_CBC = 1 Private Const CALC_3DES = 26115 Private Const CALG_SHA1 = 32772 Public Function MBI_Encrypt(ByVal key As String, ByVal nonce As String) As String Dim key1() As Byte, key2 As String, key3 As String, hash() As Byte, alg2 As HMACSHA1 Dim alg3 As TripleDESCryptoServiceProvider, iv(), gg() As Byte Dim akm As ICryptoTransform, blob As String, kk(71) As Byte key1 = Convert.FromBase64String(key) key2 = derive_key(key1, "WS-SecureConversationSESSION KEY HASH") key3 = derive_key(key1, "WS-SecureConversationSESSION KEY ENCRYPTION") alg2 = HMACSHA1.Create alg2.Key = Encoding.Default.GetBytes(key2) hash = alg2.ComputeHash(Encoding.Default.GetBytes(nonce)) Randomize() iv = Encoding.Default.GetBytes(Mid(Convert.ToBase64String(Encoding.Default.GetBytes(Rnd())), 4, 8)) alg3 = TripleDESCryptoServiceProvider.Create alg3.Key = Encoding.Default.GetBytes(key3) alg3.Mode = CipherMode.CBC alg3.IV = iv akm = alg3.CreateEncryptor gg = Encoding.Default.GetBytes(nonce & Chr(8) & Chr(8) & Chr(8) & Chr(8) & Chr(8) & Chr(8) & Chr(8) & Chr(8)) akm.TransformBlock(gg, 0, gg.Length, kk, 0) blob = MakeDWord(28) & MakeDWord(CRYPT_MODE_CBC) & MakeDWord(CALC_3DES) & MakeDWord(CALG_SHA1) & MakeDWord(iv.Length) & MakeDWord(hash.Length) & MakeDWord(kk.Length) & _ Encoding.Default.GetString(iv) & Encoding.Default.GetString(hash) & Encoding.Default.GetString(kk) Return Convert.ToBase64String(Encoding.Default.GetBytes(blob)) End Function Private Function derive_key(ByVal key() As Byte, ByVal magic As String) As String Dim alg1 As HMACSHA1, hash1(), hash2(), hash3(), hash4() As Byte, magicb() As Byte magicb = Encoding.Default.GetBytes(magic) alg1 = HMACSHA1.Create alg1.Key = key hash1 = alg1.ComputeHash(magicb) hash2 = alg1.ComputeHash(Encoding.Default.GetBytes(Encoding.Default.GetString(hash1) & magic)) hash3 = alg1.ComputeHash(hash1) hash4 = alg1.ComputeHash(Encoding.Default.GetBytes(Encoding.Default.GetString(hash3) & magic)) Return Encoding.Default.GetString(hash2) & Mid(Encoding.Default.GetString(hash4), 1, 4) End Function