将Coldfusion加密代码转换为C#

时间:2015-01-08 20:30:57

标签: c# encryption coldfusion base64 blowfish

我有一个Coldfusion页面,其中包含一段加密变量的代码:

<cfset data64 = toBase64(key)>
<cfset encryptedID = encrypt(getUser.ID, data64, "BLOWFISH", "Base64")>

我们正在将网站迁移到基于.NET的CMS,我需要将此网页转换为C#,但我遇到了麻烦。

我已成功将第一行转换为:

byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(key);
string keyBase64 = System.Convert.ToBase64String(keyBytes);

我还添加了在https://defuse.ca/blowfish.htm找到的blowfish.cs课程,但我对如何使用密钥(以及我是否想要使用ECB,CBC)感到很困惑或CTR)。我也不确定在Coldfusion中使用base64编码的模拟是什么...这是我目前正在尝试的,它不会产生与原始代码相同的结果:

BlowFish b = new BlowFish(keyBase64);
byte[] idBytes = System.Text.Encoding.UTF8.GetBytes(thisUser["ID"].ToString());
byte[] idBytesEncrypted = b.Encrypt_ECB(idBytes);
string idBase64 = System.Convert.ToBase64String(idBytesEncrypted);

我一般没有多少加密经验,Coldfusion代码是在另一位没有C#经验的开发人员的帮助下建立的。任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

您可能想尝试BouncyCastle C# API。我为POC运行了一些测试,它似乎产生与CF代码相同的结果。

要记住的一些事项:如果您阅读Strong Encryption in ColdFusion,它会解释ColdFusion默认使用ECB模式和PKCS5Padding。因此,在指定简写Blowfish时,您实际上是在说使用Blowfish/ECB/PKCS5Padding。要以C#(或任何语言)复制加密,您必须使用相同的设置。

C#端口似乎没有很多文档,但我可以告诉BlowfishEngine默认为ECB模式。因此,如果将其包装在PaddedBufferedBlockCipher中,结果应该是PKCS5填充。这应该给你与CF代码相同的结果:

    byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(userIDString);
    byte[] keyBytes = System.Convert.FromBase64String(keyInBase64);

    // initialize for ECB mode and PKCS5/PKCS7 padding
    PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new BlowfishEngine());
    KeyParameter param = new KeyParameter(keyBytes);
    cipher.Init(true, param);

    // encrypt and encode as base64
    byte[] encryptedBytes =  cipher.DoFinal(inputBytes);
    string idBase64 = System.Convert.ToBase64String(encryptedBytes);

NB:我不是加密专家,但会说使用&#34; ECB&#34;不鼓励使用模式。见wiki for a good illustration of why。所以你应该认真考虑choosing a different mode