Scramble/unscramble 一个整数值 to/from 十六进制字符串

Scramble/unscramble an integer value to/from hexadecimal string

我正在尝试实现一些 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
}

认为 异或可能是正确的方向,但我不确定并且还不是特别熟悉该主题。

任何 insight/direction 将不胜感激!如果我可以提供任何额外的 context/clarifications.

,请告诉我

有许多本机或外部包可以实现您想要的功能,但如果您想自己实现它以获取学习经验,您可以尝试以下方法:

与其在字符串和 int32 格式之间来回变换您的数据,不如将数据保留为原始类型并使用 Stringer 方法转换为十六进制,并使用助手 methods/functions 转换为所需的类型。这简化了 scrambling/unscrambling 逻辑——因为两者的输入类型相同。

// 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)

游乐场示例:https://play.golang.org/p/y5pbac_f8Z1