1 回答

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
和掃描儀,它會像你期望的那樣工作。
在發件人方面,您應該:
加密明文得到密文
將密文編碼為base64
將換行符添加到 base64
使用傳輸數據
conn.Write
在接收方的另一端,您現在可以:
使用掃描儀接收以 base64 編碼的加密密文塊
Base64 將接收到的字節解碼回它的密文
將密文解密為純文本
用純文本做任何你想做的事
編輯:我知道這不能回答您回答的確切問題。為了完整起見,這是答案:
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
。寫入它的內容保留為字節,無需經過任何格式化、映射或其他“篡改”。
- 1 回答
- 0 關注
- 100 瀏覽
添加回答
舉報