亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Fprint/Fprintf 與 conn.Write 的區別

Fprint/Fprintf 與 conn.Write 的區別

Go
慕蓋茨4494581 2022-05-18 14:41:33
我正在嘗試通過 TCP 連接發送加密數據。Fprintf 適用于未加密的數據,但似乎正在為加密數據添加格式,導致解密間歇性失敗。我無法使用 conn.Write 或就此而言 writer.Writestring 后跟 writer.Flush() 發送。    scanner := bufio.NewScanner(os.Stdin)    for scanner.Scan() && err == nil {        msg := scanner.Text()            ciphertext := edlogic.Encrypt([]byte(msg+"\n")            conn.Write(append(ciphertext, '\r'))    }    //Receiver    scanner := bufio.NewScanner(conn)        for scanner.Scan() {        ciphertext := scanner.Bytes()        plaintext := edlogic.Decrypt(ciphertext)        fmt.Println(string(plaintext))        }
查看完整描述

1 回答

?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

這里有幾點希望能幫助您弄清楚為什么這不起作用。我假設您在內部edlogic使用的任何加密方法都在此交易的雙方使用正確的密鑰,因為我們不了解您實際使用的加密技術。如果您不確定您是否正確執行此操作,請嘗試編寫一個單獨的程序來加密一些已知的純文本,檢查它以確保密文看起來不像您的純文本,解密它,并將其與原始輸入進行比較以確保它匹配。如果您的加密不起作用,那么通過 TCP 傳輸將無法修復它。

您在發送方的掃描儀使用似乎沒問題,但接收方的掃描儀會出現問題。一方面,@Adrian 在他們的評論中所說的一切都是正確的。您正在加密您的\n,然后附加\r,然后接收端的掃描儀正在尋找\n. 這是有問題的,令人討厭的是,解決方案不是簡單地附加\n而不是\r. 要知道原因,您需要了解一兩個關于密碼學的細節。

散列、加密、解密,無論你在現代密碼學中做什么,你幾乎總是對字節進行操作。輸入。輸出。您看不到的所有中間部分。字節。這些字節的內容絕對是零保證。從理論上講,每個字節都有相同的機會包含 0 到 255 之間的任何值(包括 0 到 255)。將有空字節、ASCII 外觀字節,可能是有效的 unicode,因為你知道輸出是幾十個便便表情符號。關鍵是唯一安全的假設是輸出字節(“密文”,你正確標記它但記住,不是傳統意義上的文本)看起來不像輸入字節(“純文本”,也沒有t必須是文本,可以加密二進制文件。解密后的密文也稱為明文)。

加密消息后,原始輸出中可能會有新的行字節。您不能使用像換行符這樣的標記值作為分隔符。最簡單的替代方法是將字節編碼為 base64 ( import "encoding/base64") 并發送?,F在您可以安全地選擇不在 base64 字符集中的哨兵。使用\n和掃描儀,它會像你期望的那樣工作。

在發件人方面,您應該:

  1. 加密明文得到密文

  2. 將密文編碼為base64

  3. 將換行符添加到 base64

  4. 使用傳輸數據conn.Write

在接收方的另一端,您現在可以:

  1. 使用掃描儀接收以 base64 編碼的加密密文塊

  2. Base64 將接收到的字節解碼回它的密文

  3. 將密文解密為純文本

  4. 用純文本做任何你想做的事

編輯:我知道這不能回答您回答的確切問題。為了完整起見,這是答案:

Fprint將打印您給它的所有內容,Writer但會首先嘗試將其他參數格式化為字符串。這不是發送字節的好方法。fmt.Fprint(os.Stdout, []byte{1, 2, 3})不寫入值為 1、2 和 3 的 3 個字節。它寫入 7 個字節,即字符串,[1 2 3]因為這就是 fmt 的默認格式化程序格式化字節數組/切片的方式。

Fprintf給你更多的控制權。您可以使用格式化“動詞”來覆蓋默認格式化程序。對于字節數組/切片,您可以使用 %s 將字節解析為字符串(不推薦,除非您知道所有字節都是有效的 unicode), %x 和 %X 分別使用小寫或大寫字母以十六進制打印字節, 和 %v 將使用默認格式化程序,它將打印所有字節的十進制值,以空格分隔,并以方括號結尾。它仍然不適合將字節寫成字節。

我會假設它conn來自一個net.Dial(...)或類似的東西,可能會使它成為 interface net.Conn。寫入它的內容保留為字節,無需經過任何格式化、映射或其他“篡改”。


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號