2017-04-13 152 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();