{{category ScrapCode,VBScript,nolink}}VBScriptでのデータ変換 !!!バイナリエンコード・デコード !!Microsoft.XMLDOMでHEX文字列 Microsoft.XMLDOM を使用し、バイナリデータの16進数文字列を求める。英字は小文字になる。 {{code Text,4, Set objDom = CreateObject("Microsoft.XMLDOM") Set objElm = objDom.CreateElement("work") objElm.DataType = "bin.hex" objElm.NodeTypedValue = binData ' バイナリデータ strText = objElm.Text ' 16進数文字列 Set objElm = Nothing Set objDom = Nothing }} !!Microsoft.XMLDOMでBASE64エンコード Microsoft.XMLDOM を使用し、マルチバイト文字やバイナリデータを64種類の印字可能な英数字のみのBASE64へエンコード処理をする。 {{code Text,4, Set objDom = CreateObject("Microsoft.XMLDOM") Set objElm = objDom.CreateElement("work") objElm.DataType = "bin.base64" objElm.NodeTypedValue = binData ' バイナリデータ strText = objElm.Text ' BASE64テキスト 'strText = Replace(objElm.Text, vbLf, vbCrLf) Set objElm = Nothing Set objDom = Nothing }} 得られるBASE64テキストの改行がLFなので、必要に応じてReplace関数で vbLf から vbCrLf に変更する。 !!Microsoft.XMLDOMでBASE64デコード Microsoft.XMLDOM を使用し、BASE64のテキストをデコード処理しデータを取得する。 {{code Text,4, Set objDom = CreateObject("Microsoft.XMLDOM") Set objElm = objDom.CreateElement("work") objElm.DataType = "bin.base64" objElm.Text = strText ' BASE64テキスト binData = objElm.NodeTypedValue ' バイナリデータ Set objElm = Nothing Set objDom = Nothing }} !!CAPICOMでHEX文字列 CAPICOM を使用し、バイナリデータの16進数文字列を求める。 {{code Text,4, Set objUtil = CreateObject("CAPICOM.Utilities") strText = objUtil.BinaryToHex(binData) Set objUtil = Nothing }} {{code Text,4, Set objUtil = CreateObject("CAPICOM.Utilities") binData = objUtil.HexToBinary(strText) Set objUtil = Nothing }} !!CAPICOMでBASE64エンコード・デコード CAPICOM を使用し、BASE64 エンコード・デコード処理をする。 {{code Text,4, Set objUtil = CreateObject("CAPICOM.Utilities") strText = objUtil.Base64Encode(binData) Set objUtil = Nothing }} {{code Text,4, Set objUtil = CreateObject("CAPICOM.Utilities") binData = objUtil.Base64Decode(strText) Set objUtil = Nothing }} !!!一方向ハッシュ !!CAPICOMでハッシュ値 CAPICOM(Crypt API COM)を使ってハッシュ値を求める。文字列を渡した場合、UTF-16LE で求められる(WSH がそういうバイナリで渡していると思うけど WinXP, WSH 5.6)。 {{code Text,4, ' CAPICOM's hash algorithm constants. Const CAPICOM_HASH_ALGORITHM_SHA1 = 0 Const CAPICOM_HASH_ALGORITHM_MD2 = 1 Const CAPICOM_HASH_ALGORITHM_MD4 = 2 Const CAPICOM_HASH_ALGORITHM_MD5 = 3 Const CAPICOM_HASH_ALGORITHM_SHA256 = 4 Const CAPICOM_HASH_ALGORITHM_SHA384 = 5 Const CAPICOM_HASH_ALGORITHM_SHA512 = 6 Set objHash = CreateObject("CAPICOM.HashedData") objHash.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1 ' アルゴリズム objHash.Hash binData ' データ strHashValue = objHash.Value ' ハッシュ値文字列 Set objHash = Nothing }} !!MS.NETでMD5ハッシュ値 Microsoft .NET Framework の暗号化サービスプロバイダを利用して、MD5のハッシュ値を求める。求めたハッシュ値もバイナリのままなので16進数文字列等に変換する必要がある。 {{code Text,4, Set objCSP = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider") objCSP.ComputeHash_2(binData) ' データ binHash = objCSP.Hash ' ハッシュ値 Set objCSP = Nothing }} !!MS.NETでSHA1ハッシュ値 Microsoft .NET Framework の暗号化サービスプロバイダを利用して、SHA1のハッシュ値を求める。求めたハッシュ値もバイナリのままなので16進数文字列等に変換する必要がある。 {{code Text,4, Set objCSP = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") objCSP.ComputeHash_2(binData) ' データ binHash = objCSP.Hash ' ハッシュ値 Set objCSP = Nothing }} !!!暗号化 ""Note CAPICOM does not support the PKCS #7 EncryptedData content type but uses a nonstandard ASN structure for EncryptedData. Therefore, only CAPICOM can decrypt a CAPICOM EncryptedData object. ""http://msdn.microsoft.com/ja-jp/library/aa382010%28en-us,VS.85%29.aspx CAPICOM よって暗号化したデータは、CAPICOM でしか復元できない。 暗号データは、非標準の ASN データ構造を BASE64 しているので、構造・要素を解析すれば、利用できる? AES のとき、常に結果が変わるので CBC モードで暗号化されているか。なので、ASN の中に IV の値も含まれている? !!CAPICOMで暗号化 CAPICOM(Crypt API COM)を使って共通鍵の暗号化する。 {{code Text,4, ' CAPICOM's encryption algorithm constants. Const CAPICOM_ENCRYPTION_ALGORITHM_RC2 = 0 Const CAPICOM_ENCRYPTION_ALGORITHM_RC4 = 1 Const CAPICOM_ENCRYPTION_ALGORITHM_DES = 2 Const CAPICOM_ENCRYPTION_ALGORITHM_3DES = 3 Const CAPICOM_ENCRYPTION_ALGORITHM_AES = 4 ' CAPICOM's encryption key length constants. Const CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM = 0 Const CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS = 1 Const CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS = 2 Const CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS = 3 Const CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS = 4 Const CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS = 5 Set objCrypt = CreateObject("CAPICOM.EncryptedData") objCrypt.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_AES objCrypt.Algorithm.KeyLength = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM objCrypt.SetSecret password ' パスワード objCrypt.Content = content ' 平文 encrypt = objCrypt.Encrypt ' 暗号文 Set objCrypt = Nothing }} !!CAPICOMで復号化 CAPICOM(Crypt API COM)を使って共通鍵の復号する。 {{code Text,4, ' CAPICOM's encryption algorithm constants. Const CAPICOM_ENCRYPTION_ALGORITHM_RC2 = 0 Const CAPICOM_ENCRYPTION_ALGORITHM_RC4 = 1 Const CAPICOM_ENCRYPTION_ALGORITHM_DES = 2 Const CAPICOM_ENCRYPTION_ALGORITHM_3DES = 3 Const CAPICOM_ENCRYPTION_ALGORITHM_AES = 4 ' CAPICOM's encryption key length constants. Const CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM = 0 Const CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS = 1 Const CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS = 2 Const CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS = 3 Const CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS = 4 Const CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS = 5 Set objCrypt = CreateObject("CAPICOM.EncryptedData") objCrypt.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_AES objCrypt.Algorithm.KeyLength = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM objCrypt.SetSecret password ' パスワード objCrypt.Decrypt decrypt ' 暗号文 decrypt = objCrypt.Content ' 平文 Set objCrypt = Nothing }}