将 Coldfusion 加密代码转换为 C#

本文关键字:转换 代码 Coldfusion 加密 | 更新日期: 2023-09-27 18:37:00

我有一个 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 中找到的河豚.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# 经验的开发人员的帮助下设置的。 任何建议将不胜感激。 谢谢!

将 Coldfusion 加密代码转换为 C#

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

要记住的几件事:如果您阅读 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);

注意:我不是加密专家,但会说不鼓励使用"ECB"模式。请参阅维基以很好地说明原因。因此,您应该认真考虑选择其他模式。