go - 加扰/解扰整数值到/从十六进制字符串

标签 go cryptography integer hex

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

我认为 XOR'ing 可能是正确的方向,但我不确定,也不是特别熟悉这个话题。

任何见解/方向将不胜感激!如果我可以提供任何其他上下文/说明,请告诉我。

最佳答案

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

而不是在字符串和 int32 格式之间来回打乱您的数据 - 将数据保持在其原始类型并使用 Stringer 方法转换为十六进制 - 并使用辅助方法/函数转换为所需的类型。这简化了加扰/解扰逻辑 - 因为两者的输入类型相同。

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

关于go - 加扰/解扰整数值到/从十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237142/

相关文章:

c++ - 覆盖智能卡的 RSA 私钥操作?

algorithm - 如何仅在一个时钟周期内获得 32 位输入的平方根?

string - "set foo to text returned of"代表数字吗?

php - 大整数乘积差分算法

Docker,从 bitbucket 私有(private)仓库中获取

string - Golang 中的 *string 和 string 有什么区别?

c - 在Linux内核空间使用MD5

go - 如何使用 jwt golang 包通过 ECDSA 方法签署 JWT - Sign in with Apple

pointers - 隐藏 nil 值,理解为什么 Go 在这里失败

ios - 相当于 bouncycaSTLe 的 CBCBlockCipherMac for swift