我正在尝试实现一些Go代码,以解决以下问题:当提供已知键值作为附加输入参数时,我需要通过将其转换为看似随机的十六进制字符串来充分混淆已知整数值。结果十六进制字符串的长度必须始终为相同数目的字符(理想情况下,<= 32个字符)。
此外,使用相同的键字符串值,我需要取消混淆将十六进制字符串恢复为原始整数。对于其他上下文,我想满足以下函数签名(但如有必要,可以使用其他方法):
func Scramble(key string, value int32) string {
// TODO: Given a known key and value, generate a sufficiently unpredictable hexadecimal string.
}
func Unscramble(key string, value string) int32 {
// TODO: Given a known key and value, generate the integer that created the hexadecimal string.
}
func main() {
key := "Something super secret!"
scrambled := Scramble(key, 135)
fmt.Printf("Scrambled: %s\n", scrambled) // Scrambled: a1dec128b590b9ec3281110d6d188c26
unscrambled := Unscramble(key, scrambled)
fmt.Printf("Unscrambled: %d\n", unscrambled) // Unscrambled: 135
}
我思考异或运算可能是正确的方向,但是我不确定,并且对该主题还不是特别熟悉。
任何见解/方向将不胜感激!请让我知道是否可以提供其他上下文/说明。
有许多本机或外部程序包可以实现所需的功能,但是如果您想自己实现此功能以获取学习经验,可以尝试以下方法:
而不是在字符串和int32格式之间来回拖曳数据-将数据保留为原始类型,并使用Stringer方法转换为十六进制-并将helper方法/函数转换为所需的类型。这简化了加扰/解扰逻辑-两者的输入类型相同。
// Code custom type so we can add stringer methods
type Code uint32
// String converts code to hex string format
func (c Code) String() string {
return fmt.Sprintf("%x", uint32(c))
}
// CodeFromString gets a code from a hex string
func CodeFromString(hexs string) (Code, error) {
ui, err := strconv.ParseUint(hexs, 16, 32)
if err != nil {
return 0, err
}
return Code(ui), nil
}
// XOR scrambles/unscrambles
func XOR(key, value Code) Code {
return key ^ value
}
并使用:
keyHex := "74490a85"
valueHex := "d195c729"
value, _ := CodeFromString(valueHex)
key, _ := CodeFromString(keyHex)
scrambled := XOR(key, value)
unscrambled := XOR(key, scrambled)