2017-10-14 81 views
-3

我有以下功能使用Blowfish.If編碼字符串,我把只是一個字符串到字節數組它的工作原理。問題是與線 cipher.Encrypt(ENC [0:],SRC)轉到河豚怪異的東西

func BlowFish(str string){ 
    key := []byte("super secret key") 

    cipher,err := blowfish.NewCipher(key) 
    if err != nil { 
     log.Fatal(err) 
    } 


    //very weird that I get index out of range if I insert a var 
    src :=[]byte(str+"\n\n\n") 

    var enc [512]byte 
    cipher.Encrypt(enc[0:],src) 

    fmt.Println("Encoded",enc) 

    var decrypt[8] byte 
    cipher.Decrypt(decrypt[0:],enc[0:]) 

    result:=bytes.NewBuffer(nil) 
    result.Write(decrypt[0:8]) 

    fmt.Println(string(result.Bytes())) 
} 

我不明白的問題

+0

請告訴我們你的斷碼的,不是你的工作代碼。 – Flimzy

+0

這裏是破碎版本 –

+0

你得到了什麼_exact_錯誤?沒有理由你的'src:='行應該失敗。參見[遊樂場](https://play.golang.org/p/N4h7onxGq7)。 – Flimzy

回答

0

看起來像我發現了什麼問題。 cypher.Encrypt接受長度爲8的字節數組。但字節數組[]字節(str +「\ n \ n \ n」)的長度爲4.這就是爲什麼我的索引超出範圍。如果我有一個數組[]字節(「我的str編碼」+「\ n \ n \ n」)。它是len是2個字符串的len。對於現在的解決方案是增加等等\ n字符爲具有陣列STR +的長度「\ n .... \ n」個> =大於8

3

雖然這可能導致使用圍棋的Blowfish錯誤,它是正確的。 Blowfish是一個64位(讀取8字節)的分組密碼。正如你發現的那樣,你的字符串不僅需要8個字節的填充,而且你希望加密的任何數據都必須填充以便所有的塊都等於8個字節。

要做到這一點,你應該檢查你的數據的模量和填充剩餘,使數據的長度爲8的倍數,像這樣。

func blowfishChecksizeAndPad(pt []byte) []byte { 
    // calculate modulus of plaintext to blowfish's cipher block size 
    // if result is not 0, then we need to pad 
    modulus := len(pt) % blowfish.BlockSize 
    if modulus != 0 { 
     // how many bytes do we need to pad to make pt to be a multiple of 
     //blowfish's block size? 
     padlen := blowfish.BlockSize - modulus 
     // let's add the required padding 
     for i := 0; i < padlen; i++ { 
      // add the pad, one at a time 
      pt = append(pt, 0) 
     } 
    } 
    // return the whole-multiple-of-blowfish.BlockSize-sized plaintext 
    // to the calling function 
    return pt 
} 
+0

最好不要使用null填充,它與二進制數據不兼容。請使用{PKCS#7填充](https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7)。 – zaph

+2

在問題的上下文中,當他編碼一個字符串時,沒有二進制數據,並且可以將空字符作爲空格刪除。 –

+1

Downvoting是因爲我不同意字符串需要PKCS7填充,特別是在應該保持簡單的示例代碼的上下文中,只是讓你看起來很小氣。 :| –