2017-04-13 221 views
1

我有一个客户需要我们使用Blowfish ECB加密和cipherMode 0,输出1.我试图解决这个问题,但是我陷入困境。我如何修复我的代码?C#实现中的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。我哪里做错了?

+2

哇,这是关于最差的安全明智!即使是Blowfish的作者也不再使用它,现在他使用AES。不要使用ECB模式,这是不安全的,请参阅[ECB模式](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29),向下滚动到企鹅。 – zaph

+0

你要输入什么来获得Blowfish课程?而且由于我没有看到你为填充设置了任何东西,那么包含Blowfish类的库的默认文档默认为它正在使用? –

+0

最后是更新安全性的时候了,AES已经有15年了,客户应该真的努力,再等15年将是荒谬的。 – zaph

回答

1

Encrypt_ECB()所以我假设它的Schneier的类。

的构造函数需要一个十六进制字符串,如果获得通过,你需要一个字节数组超载:

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

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

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

给我们:

"3280:99:20120201123050\u0002\u0002" 

这是很好的,但也有2 0 x2字节在结尾,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();