简体   繁体   中英

Blowfish ECB encryption in C# implementation

I have a client who needs us to use Blowfish ECB encryption with cipherMode 0, output 1. I have tried to solve for this, but I'm getting stuck. How do I fix my code?

Here are the full client instructions:

Algorithm: Blowfish ・ Mode: ECB ・ Padding: PKCS5Padding *Initial vector is unnecessary because we use ECB mode.

Example・Encrypt Key: 2fs5uhnjcnpxcpg9 → Plain Text : 3280:99:20120201123050 → Cipher Text : daa745f1901364c0bd42b9658db3db96336758cd34b2a576 * Please keep Cipher Text with 16 hexadecimal characters .* Please generate Cipher Text without “salt”.

I need to write this in C#. Here's what I did, but it doesn't seem to be working:

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");

The result is not daa745f1901364c0bd42b9658db3db96336758cd34b2a576. Where did I go wrong?

Encrypt_ECB() so I assume its Schneier's class.

The ctor expects a hexadecimal string if one is passed, you need the overload for a byte array:

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

The output is still not correct, lets see what it really should be by decrypting their example:

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

gives us:

"3280:99:20120201123050\u0002\u0002"

Which is good but there are 2 0x2 bytes on the end, the N x 0xN is due to the PKCS padding. To get the match you need to pad the input:

// 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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM