Clow实现中的Blowfish ECB加密

时间:2017-04-13 16:09:45

标签: c# encryption blowfish

我有一个客户需要我们使用Bushfish ECB加密和cipherMode 0,输出1.我试图解决这个问题,但我遇到了困难。如何修复代码?

以下是完整的客户说明:

算法:Blowfish ·模式:欧洲央行 ·填充:PKCS5Padding *初始向量是不必要的,因为我们使用ECB模式。

示例 ·加密密钥:2fs5uhnjcnpxcpg9 →纯文本:3280:99:20120201123050 →密文:daa745f1901364c0bd42b9658db3db96336758cd34b2a576 *请使用16个十六进制字符保存密文。 *请生成没有“盐”的密文。

我需要在C#中写这个。这就是我所做的,但它似乎没有起作用:

string member_id = "3280";
        string panelType = "99";
        string RandomString = "20120201123050";
        string encryptionKey = "2fs5uhnjcnpxcpg9";
        string cryptstr = member_id + ":" + panelType + ":" + RandomString;
        string plainText = cryptstr;
        BlowFish b = new BlowFish(encryptionKey);
        string cipherText = b.Encrypt_ECB("3280:99:20120201123050");

结果不是daa745f1901364c0bd42b9658db3db96336758cd34b2a576。我哪里出错了?

1 个答案:

答案 0 :(得分:1)

Encrypt_ECB()所以我假设是施奈尔的班级。

如果传递一个十六进制字符串,那么ctor需要一个十六进制字符串,你需要一个字节数组的重载:

BlowFish b = new BlowFish(Encoding.UTF8.GetBytes(encryptionKey));

输出仍然不正确,让我们通过解密他们的例子看看它应该是什么:

string clear = b.Decrypt_ECB("daa745f1901364c0bd42b9658db3db96336758cd34b2a576");

给我们:

"3280:99:20120201123050\u0002\u0002"

哪个好,但最后有2个0x2字节,N x 0xN是由PKCS填充引起的。要获得匹配,您需要填充输入:

// input to bytes
List<byte> clearBytes = new List<byte>(Encoding.UTF8.GetBytes("3280:99:20120201123050"));

// how many padding bytes?
int needPaddingBytes = 8 - (clearBytes.Count % 8);

// add them
clearBytes.AddRange(Enumerable.Repeat((byte)needPaddingBytes, needPaddingBytes));

// encrypt
byte[] cipherText = b.Encrypt_ECB(clearBytes.ToArray());

// to hex
string cipherTextHex = BitConverter.ToString(cipherText).Replace("-", "").ToLowerInvariant();