gpt4 book ai didi

go - 如何用golang实现slowEqual

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:15 25 4
gpt4 key购买 nike

我尝试用 golang 实现一个 slowEqual,但是 xor 操作仅限于 int 和 int8 并且我不知道将 string 转换为 int[] 或 int8[] ,即使它可以转换看起来有点尴尬,我找到 bytes.Equal 但它似乎不是一个 slowEqual 实现。有什么建议吗?这是我的实现。

//TODO real slow equal
func slowEquals(a, b string) bool {
al := len(a)
bl := len(b)
aInts := make([]int, al)
bInts := make([]int, bl)
for i := 0; i < al; i++ {
aInts[i] = int(a[i])
}
for i := 0; i < bl; i++ {
bInts[i] = int(b[i])
}
var diff uint8 = uint8(al ^ bl)
for i := 0; i < al && i < bl; i++ {
diff |= a[i] ^ b[i]
}
return diff == 0
//长度相等为0
/*
abytes := []int8()
bbytes := []int8()
al := len(a)
bl := len(b)
diff := al ^ bl
for i := 0; i < al && i < bl; i++ {
diff |= a[i] ^ b[i]
}
return diff == 0
*/
}

或者:(在第一次回答之后)

import "crypto/subtle"

func SlowEquals(a, b string) bool {
if len(a) != len(b) {
return subtle.ConstantTimeCompare([]byte(a), make([]byte,len(a))) == 1
}else{
return subtle.ConstantTimeCompare([]byte(a), []byte(b)) == 1
}
}

最佳答案

也许是这样:

import "crypto/subtle"

func SlowEquals(a, b string) bool {
if len(a) != len(b) {
return false
}
return subtle.ConstantTimeCompare([]byte(a), []byte(b)) == 1
}

如果长度不同,这会很快返回,但是对揭示 a 长度的原始代码有一个定时攻击,所以我认为这并不更糟。

关于go - 如何用golang实现slowEqual,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23171862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com