将Coldfusion加密代码转换为C#

将Coldfusion加密代码转换为C#,c#,encryption,coldfusion,base64,blowfish,C#,Encryption,Coldfusion,Base64,Blowfish,我有一个Coldfusion页面,其中包含一段加密变量的代码,如下所示: <cfset data64 = toBase64(key)> <cfset encryptedID = encrypt(getUser.ID, data64, "BLOWFISH", "Base64")> 我还添加了在中找到的blowfish.cs类,但我对如何将其与键一起使用(以及我是想使用ECB、CBC还是CTR)有点模糊。我也不确定在Coldfusion中使用base64编码的类比是什么。。

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

<cfset data64 = toBase64(key)>
<cfset encryptedID = encrypt(getUser.ID, data64, "BLOWFISH", "Base64")>
我还添加了在中找到的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#经验的开发人员的帮助下建立的。如有任何建议,将不胜感激。谢谢大家!

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

需要记住的几件事:如果您阅读了它,它会解释ColdFusion默认使用ECB模式和PKCS5P添加。因此,当指定速记
河豚
时,实际上是说使用
河豚/ECB/PKCS5Padding
。为了在C#(或任何语言)中复制加密,必须使用相同的设置

关于C#端口的文档似乎不多,但从我所能看出,
BlowfishEngine
默认为ECB模式。因此,如果将其包装在一个
PaddedBufferedBlockCipher
中,结果应该是PKCS5 padded。这将为您提供与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:我不是加密专家,但会说不鼓励使用“ECB”模式。看见所以你应该认真考虑。

代码注释提到的关键字预计是十六进制,而不是Base64。然而,尽管用一个十六进制键运行了一些测试,我仍然可以得到精确匹配的结果-非常接近-但没有雪茄。可能与填充方案有关。诚然,我没有深入查看代码,因此可能忽略了一些显而易见的东西。非常感谢,这非常有效!我开始怀疑这是否与填充物有关,但我肯定我会陷入其中一段时间,而你为我节省了很多时间和愤怒。这段代码是我们与第三方共同开发的sso的一部分,实际上是他们提出了这种方法。不过,你所说的阻止欧洲央行模式很有道理,所以我会向他们提出这一点,看看我们是否可以调整情况。(编辑)很高兴这有帮助。我得到的印象是,这不仅仅是一个填充差异,但没有时间进一步探讨它。关于欧洲央行,我的理论是,人们推荐它有两个原因:1)他们知道得更好,只是把它作为其他人的一个简单例子。因为它的运动部件较少,所以更容易跟随;或者2)他们不知道有什么不同。
    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);