2013-02-25 147 views
0

我需要爲服務器創建一個加密密碼。此服務器使用Blowfish加密來執行加密。現在,這裏是信息我有:用字節[24]長度的BLOWFISH創建加密密碼

  1. KEY: 「12345678abcdefgmypassword」
  2. 塊大小:8個字節 - 64位
  3. END BYTES:字節[24]

的數據,我要加密的是「ABCDEFG12345678」。

我遇到的問題是得到只有24個字節的加密,每次我得到48個。 我認爲我最大的問題是因爲我無法將自己的頭圍繞在應該發生的事情上!

下面是我的一些代碼:

> BlowFish b = new BlowFish("12345678abcdefgmypassword"); 
> Here I get the key array of byte[12] 
> plainText = "ABCDEF"; 
> cipherText = b.Encrypt_CBC(plainText); 
> var encodedString = System.Text.Encoding.ASCII; 
> byte[] myByteArray = encodedString.GetBytes(cipherText); 

現在的問題,我有: 1.什麼是塊的大小?我該如何使用它? 2.如何得到低於或等於字節[24]的字節?

我真的希望你們中的一些人能幫助我的大腦開始朝着正確的方向前進。 謝謝。

+0

你實際上是指blowfish加密還是bcrypt哈希? – CodesInChaos 2013-02-25 19:05:28

+0

我懷疑你搞砸了編碼的地方。 – CodesInChaos 2013-02-25 19:06:56

+0

在密文上使用ASCII不可能是正確的。如果'Encrypt_CBC'返回一個十六進制字符串,則需要對其應用十六進制解碼。 – CodesInChaos 2013-02-25 19:07:56

回答

0

A Block size是分組密碼一次處理的數據量。例如,如果加密算法的塊大小是128位,那麼在ASCII中將是16個字符。

要使用塊大小,您需要將「明文」(尚未加密的文本)分段爲64位塊(在您的情況下)。然後通過加密循環每個塊,並連接輸出。 (如果你正在實施ECB加密,這是不推薦的)。

正如我上面所說的,你需要把你的文本分塊。最後的塊可能在必要的塊大小下,並且需要padding

希望這讓你在右邊線:)

+0

一些代碼將如何查看? > Blowfish b =新Blowfish(hexkey)。 如何從「12345678abcdefgmypassword」獲取十六進制密鑰? – 2013-02-25 20:33:32

0

你可能有一個看看源代碼在這裏http://www.schneier.com/code/blowfish.cs它可以幫助你更好地理解它是如何工作的。同樣在密碼學的優秀圖書這就解釋瞭如何將這些算法的工作是由Schneier的應用密碼學的細節在這裏http://www.amazon.com/gp/aw/d/0471117099/發現

編輯:

好吧,我有時間玩這個,我想我知道是什麼你遇到的問題是。原因是48字節數據而不是24字節是因爲您試圖操作字節長度爲48個字節的字符串表示形式,以便以ASCII格式顯示整個密文。所有你需要做的就是把ascii字符串表示轉換成一個字節數組。問題在於(你是在正確的軌道上),你必須以與加密方法相同的方式來完成。下面是代碼做到這一點:

class Program 
{ 
    private static byte[] HexToByte(string hex) 
    { 
     byte[] r = new byte[hex.Length/2]; 
     for (int i = 0; i < hex.Length - 1; i += 2) 
     { 
      byte a = GetHex(hex[i]); 
      byte b = GetHex(hex[i + 1]); 
      r[i/2] = (byte)(a * 16 + b); 
     } 
     return r; 
    } 



    private static byte GetHex(char x) 
    { 
     if (x <= '9' && x >= '0') 
     { 
      return (byte)(x - '0'); 
     } 
     else if (x <= 'z' && x >= 'a') 
     { 
      return (byte)(x - 'a' + 10); 
     } 
     else if (x <= 'Z' && x >= 'A') 
     { 
      return (byte)(x - 'A' + 10); 
     } 
     return 0; 
    } 

    static void Main(string[] args) 
    { 
     BlowFish b = new BlowFish("12345678abcdefgmypassword"); 
     string plainText = "ABCDEFG12345678"; 
     string cipherText = b.Encrypt_CBC(plainText); 
     MessageBox.Show(cipherText); 
     plainText = b.Decrypt_CBC(cipherText); 
     byte[] myByteArray = HexToByte(cipherText); 
     MessageBox.Show(plainText); 

    } 
} 

的HexToByte和GetHex方法是直接從河豚類是什麼是加密和解密時的明文使用複製。請注意,在字符串的CBC模式下,IV(初始化向量)被複制到字符串的前面,所以前8個字節是IV。在這個代碼的示例運行這裏是我得到的。

密文是ASCII十六進制represenation 「2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964」 myByteArray是相同除了其在字節[24]。

我希望這有助於男人的好運!

+0

我目前使用河豚類,但我不知道在代碼中使用什麼。我覺得我必須從我的密碼字符串創建一個十六進制字符串才能輸入代碼。但那部分沒有了我! – 2013-02-25 20:40:09

+0

@Phillip Kemp從我在課上看到的字符串的用法很好。這就是你之後對密文進行的處理,這很可能是問題所在。你如何將這些數據發送到服務器?我不清楚你到底想要做什麼? – ValueforValue 2013-02-25 20:56:59