Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 去河豚怪的地方_Go_Blowfish - Fatal编程技术网

Go 去河豚怪的地方

Go 去河豚怪的地方,go,blowfish,Go,Blowfish,我有下面的函数,它使用Blowfish对字符串进行编码。如果我只把一个字符串放到字节数组中,它就会工作。问题在于线路 cipher.Encrypt(enc[0:],src) 我不明白这个问题看来我找到了问题所在。加密接受长度为8的字节数组。但是字节数组[]字节(str+“\n\n\n”)的长度是4。这就是为什么我得到一个超出范围的索引。如果我有一个数组[]字节(“我的str编码“+”\n\n\n”)。它是两个字符串的len。目前的解决方案是添加更多\n字符,使数组str+“\n…”\n“>=的长

我有下面的函数,它使用Blowfish对字符串进行编码。如果我只把一个字符串放到字节数组中,它就会工作。问题在于线路 cipher.Encrypt(enc[0:],src)


我不明白这个问题

看来我找到了问题所在。加密接受长度为8的字节数组。但是字节数组[]字节(str+“\n\n\n”)的长度是4。这就是为什么我得到一个超出范围的索引。如果我有一个数组[]字节(“我的str编码“+”\n\n\n”)。它是两个字符串的len。目前的解决方案是添加更多\n字符,使数组str+“\n…”\n“>=的长度大于8

虽然这可能会导致使用Go Blowfish时出错,但这是正确的。是一种64位(读取8字节)分组密码。正如您所发现的,不仅字符串必须是8字节加上填充,而且您希望加密的任何数据都必须加上填充,以便所有块都等于8字节

为此,您应该检查数据的模数,并填充余数,以便数据的长度是8的倍数,如下所示

func blowfishChecksizeAndPad(pt []byte) []byte {
    // calculate modulus of plaintext to blowfish's cipher block size
    // if result is not 0, then we need to pad
    modulus := len(pt) % blowfish.BlockSize
    if modulus != 0 {
        // how many bytes do we need to pad to make pt to be a multiple of 
        //blowfish's block size?
        padlen := blowfish.BlockSize - modulus
        // let's add the required padding
        for i := 0; i < padlen; i++ {
            // add the pad, one at a time
            pt = append(pt, 0)
        }
    }
    // return the whole-multiple-of-blowfish.BlockSize-sized plaintext
    // to the calling function
    return pt
}
func-blowfishChecksizeAndPad(pt[]字节)[]字节{
//计算明文对blowfish密码块大小的模数
//如果结果不是0,那么我们需要填充
模数:=len(pt)%blowfish.BlockSize
如果模数!=0{
//我们需要填充多少字节才能使pt成为的倍数
//河豚的块头大小?
padlen:=河豚。块大小-模数
//让我们添加所需的填充
对于i:=0;i
请向我们展示您的损坏代码,而不是您的工作代码。这是损坏的版本。您得到的确切错误是什么?您的
src:=
行没有失败的原因。请参阅。我在cipher.Encrypt(enc[0:],src)上获取的索引超出了范围。我尝试将enc设置为大小为2048和4096,这没有帮助。最好不要使用空填充,它与二进制数据不兼容。而是使用{PKCS#7 padding]()。在问题的上下文中,这没关系,因为他是在编码字符串,而不是二进制数据,空字符可以去掉为空白。向下投票是因为我不同意字符串需要PKCS7填充,特别是在示例代码的上下文中,应该保持简单,这只会让你看起来很小。|空填充表示互操作性问题是因为大多数加密实现不支持空填充。这是PHP mcrypt互操作性的一个主要问题。PKCS#7实现可以很简单:
pt=append(pt,padlen)使用PKCSα7填充有助于避免未来的互操作性。此外,还应该考虑未来读者,他们不会有与此问题相同的上下文。
func blowfishChecksizeAndPad(pt []byte) []byte {
    // calculate modulus of plaintext to blowfish's cipher block size
    // if result is not 0, then we need to pad
    modulus := len(pt) % blowfish.BlockSize
    if modulus != 0 {
        // how many bytes do we need to pad to make pt to be a multiple of 
        //blowfish's block size?
        padlen := blowfish.BlockSize - modulus
        // let's add the required padding
        for i := 0; i < padlen; i++ {
            // add the pad, one at a time
            pt = append(pt, 0)
        }
    }
    // return the whole-multiple-of-blowfish.BlockSize-sized plaintext
    // to the calling function
    return pt
}