C# 实现中的 Blowfish ECB 加密
Blowfish ECB encryption in C# implementation
我有一个客户需要我们使用密码模式为 0、输出为 1 的 Blowfish ECB 加密。我试图解决这个问题,但我遇到了困难。如何修复我的代码?
以下是完整的客户端说明:
算法:河豚
・『模式:ECB
・『填充: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。我哪里错了?
Encrypt_ECB()
所以我假设它是 Schneier 的 class。
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();
我有一个客户需要我们使用密码模式为 0、输出为 1 的 Blowfish ECB 加密。我试图解决这个问题,但我遇到了困难。如何修复我的代码?
以下是完整的客户端说明:
算法:河豚 ・『模式:ECB ・『填充: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。我哪里错了?
Encrypt_ECB()
所以我假设它是 Schneier 的 class。
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();