Golang 使用 MD5 编码字符串 UTF16 little endian 和哈希
Golang encode string UTF16 little endian and hash with MD5
我是一名 Go 初学者,遇到了一个问题。
我想用 UTF16 little endian 编码一个字符串,然后用 MD5(十六进制)对其进行哈希处理。我找到了一段 Python 代码,它完全符合我的要求。但是我无法将其转移到 Google Go.
md5 = hashlib.md5()
md5.update(challenge.encode('utf-16le'))
response = md5.hexdigest()
挑战是一个包含字符串的变量。
您可以使用unicode/utf16
package for UTF-16 encoding. utf16.Encode()
returns UTF-16编码的Unicode代码点序列(符文片段:[]rune
)。您可以简单地将 string
转换为一段符文,例如[]rune("some string")
,您可以轻松地生成 little-endian 编码的字节序列,方法是遍历 uint16
代码和 sending/appending 首先是低字节,然后是高字节到输出(这就是 Little Endian 的意思。
对于 Little Endian 编码,您也可以使用 encoding/binary
包:它有一个导出的 LittleEndian
变量和一个 PutUint16()
方法。
至于 MD5 校验和,crypto/md5
package has what you want, md5.Sum()
只是 returns 传递给它的字节片的 MD5 校验和。
这里有一个小函数可以捕捉你想做的事情:
func utf16leMd5(s string) [16]byte {
codes := utf16.Encode([]rune(s))
b := make([]byte, len(codes)*2)
for i, r := range codes {
b[i*2] = byte(r)
b[i*2+1] = byte(r >> 8)
}
return md5.Sum(b)
}
使用它:
s := "Hello, playground"
fmt.Printf("%x\n", utf16leMd5(s))
s = "エヌガミ"
fmt.Printf("%x\n", utf16leMd5(s))
输出:
8f4a54c6ac7b88936e990256cc9d335b
5f0db9e9859fd27f750eb1a212ad6212
在 Go Playground 上试用。
使用 encoding/binary
的变体如下所示:
for i, r := range codes {
binary.LittleEndian.PutUint16(b[i*2:], r)
}
(尽管这会创建很多新切片 headers,因此速度较慢。)
通过使用 golang.org/x/text/encoding and golang.org/x/text/transform 创建一个 Writer 链,您可以用更少的工作(或者至少更容易理解,IMO)来完成它,该链将进行编码和散列,而无需那么多手动字节切片处理。等效函数:
func utf16leMd5(s string) []byte {
enc := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()
hasher := md5.New()
t := transform.NewWriter(hasher, enc)
t.Write([]byte(s))
return hasher.Sum(nil)
}
因此,作为参考,我使用了这个完整的 python 程序:
import hashlib
import codecs
md5 = hashlib.md5()
md5.update(codecs.encode('Hello, playground', 'utf-16le'))
response = md5.hexdigest()
print response
它打印 8f4a54c6ac7b88936e990256cc9d335b
这是 Go 的等价物:https://play.golang.org/p/Nbzz1dCSGI
package main
import (
"crypto/md5"
"encoding/binary"
"encoding/hex"
"fmt"
"unicode/utf16"
)
func main() {
s := "Hello, playground"
fmt.Println(md5Utf16le(s))
}
func md5Utf16le(s string) string {
encoded := utf16.Encode([]rune(s))
b := convertUTF16ToLittleEndianBytes(encoded)
return md5Hexadecimal(b)
}
func md5Hexadecimal(b []byte) string {
h := md5.New()
h.Write(b)
return hex.EncodeToString(h.Sum(nil))
}
func convertUTF16ToLittleEndianBytes(u []uint16) []byte {
b := make([]byte, 2*len(u))
for index, value := range u {
binary.LittleEndian.PutUint16(b[index*2:], value)
}
return b
}
我是一名 Go 初学者,遇到了一个问题。 我想用 UTF16 little endian 编码一个字符串,然后用 MD5(十六进制)对其进行哈希处理。我找到了一段 Python 代码,它完全符合我的要求。但是我无法将其转移到 Google Go.
md5 = hashlib.md5()
md5.update(challenge.encode('utf-16le'))
response = md5.hexdigest()
挑战是一个包含字符串的变量。
您可以使用unicode/utf16
package for UTF-16 encoding. utf16.Encode()
returns UTF-16编码的Unicode代码点序列(符文片段:[]rune
)。您可以简单地将 string
转换为一段符文,例如[]rune("some string")
,您可以轻松地生成 little-endian 编码的字节序列,方法是遍历 uint16
代码和 sending/appending 首先是低字节,然后是高字节到输出(这就是 Little Endian 的意思。
对于 Little Endian 编码,您也可以使用 encoding/binary
包:它有一个导出的 LittleEndian
变量和一个 PutUint16()
方法。
至于 MD5 校验和,crypto/md5
package has what you want, md5.Sum()
只是 returns 传递给它的字节片的 MD5 校验和。
这里有一个小函数可以捕捉你想做的事情:
func utf16leMd5(s string) [16]byte {
codes := utf16.Encode([]rune(s))
b := make([]byte, len(codes)*2)
for i, r := range codes {
b[i*2] = byte(r)
b[i*2+1] = byte(r >> 8)
}
return md5.Sum(b)
}
使用它:
s := "Hello, playground"
fmt.Printf("%x\n", utf16leMd5(s))
s = "エヌガミ"
fmt.Printf("%x\n", utf16leMd5(s))
输出:
8f4a54c6ac7b88936e990256cc9d335b
5f0db9e9859fd27f750eb1a212ad6212
在 Go Playground 上试用。
使用 encoding/binary
的变体如下所示:
for i, r := range codes {
binary.LittleEndian.PutUint16(b[i*2:], r)
}
(尽管这会创建很多新切片 headers,因此速度较慢。)
通过使用 golang.org/x/text/encoding and golang.org/x/text/transform 创建一个 Writer 链,您可以用更少的工作(或者至少更容易理解,IMO)来完成它,该链将进行编码和散列,而无需那么多手动字节切片处理。等效函数:
func utf16leMd5(s string) []byte {
enc := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()
hasher := md5.New()
t := transform.NewWriter(hasher, enc)
t.Write([]byte(s))
return hasher.Sum(nil)
}
因此,作为参考,我使用了这个完整的 python 程序:
import hashlib
import codecs
md5 = hashlib.md5()
md5.update(codecs.encode('Hello, playground', 'utf-16le'))
response = md5.hexdigest()
print response
它打印 8f4a54c6ac7b88936e990256cc9d335b
这是 Go 的等价物:https://play.golang.org/p/Nbzz1dCSGI
package main
import (
"crypto/md5"
"encoding/binary"
"encoding/hex"
"fmt"
"unicode/utf16"
)
func main() {
s := "Hello, playground"
fmt.Println(md5Utf16le(s))
}
func md5Utf16le(s string) string {
encoded := utf16.Encode([]rune(s))
b := convertUTF16ToLittleEndianBytes(encoded)
return md5Hexadecimal(b)
}
func md5Hexadecimal(b []byte) string {
h := md5.New()
h.Write(b)
return hex.EncodeToString(h.Sum(nil))
}
func convertUTF16ToLittleEndianBytes(u []uint16) []byte {
b := make([]byte, 2*len(u))
for index, value := range u {
binary.LittleEndian.PutUint16(b[index*2:], value)
}
return b
}