将Coldfusion binaryDecode转换为.net

时间:2017-03-24 18:45:51

标签: .net encryption coldfusion

我试图在Coldfusion中复制一个返回字符串的函数。该函数如下所示:

<cffunction name="createKey" access="public" output="false" returntype="string"     hint="Creates a propper ecryption/decryption key from a string.">
<cfargument name="thePassword" type="string" required="yes">
<cfargument name="algorithmType" type="string" required="no" default="MD5">
<cfargument name="binaryEncodeType" type="string" required="no" default="Hex">


<cfset var theKey = Hash(ARGUMENTS.thePassword,ARGUMENTS.algorithmType)>
<cfset theKey = ToBase64(BinaryDecode(theKey, ARGUMENTS.binaryEncodeType))>

<cfreturn theKey>
</cffunction>

返回的字符串是一个键值,所以我必须从新的.Net函数中获得相同的匹配值。

此行的.net等效工作正常:

<cfset var theKey = Hash(ARGUMENTS.thePassword,ARGUMENTS.algorithmType)>

复制这一点,但是:

<cfset theKey = ToBase64(BinaryDecode(theKey, ARGUMENTS.binaryEncodeType))>

证明是困难的。我得到它解码哈希并将其转换为Base64,但CF中的BinaryDecode函数采用&#34; Hex&#34;作为解码类型。我有什么想法可以在.NET中执行此操作并获得与我在Coldfusion中获得的字符串值相同的字符串值吗?

1 个答案:

答案 0 :(得分:1)

更新

第二个想法,这可能是最好进行精确翻译的情况。如果您只需要计算普通字符串的哈希值,那么跳过转换为十六进制并直接使用二进制文件。生成的base64字符串将与之前相同,并且将匹配CF的结果。

<强> C#:

string thePlainTextPassword = "some password";
SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
byte[] data = Encoding.UTF8.GetBytes(thePlainTextPassword);
byte[] hash = sha256.ComputeHash(data);
string key = Convert.ToBase64String(hash);

CF代码:

 key = createKey(thePlainTextPassword , "SHA-256", "hex");

<强>结果:

5i4SaTF7llThMU3+y3jymzWtTTYtoKnCzNtoCqU11+o=

虽然回答原始问题,但如果你真的需要一个字面翻译,你可以使用类似于the suggestion in this answer的东西将十六进制字符串转换为字节数组:

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

然后将字节编码为base64:

 string hex = "E62E1269317B9654E1314DFECB78F29B35AD4D362DA0A9C2CCDB680AA535D7EA";
 string key = Convert.ToBase64String(StringToByteArray(hex));

<强>结果:

5i4SaTF7llThMU3+y3jymzWtTTYtoKnCzNtoCqU11+o=