我有以下函数使用Blowfish对字符串进行编码。如果我只将一个字符串放到字节数组中就可以了。问题在于线路 cipher.Encrypt(enc [0:],src)
func BlowFish(str string){
key := []byte("super secret key")
cipher,err := blowfish.NewCipher(key)
if err != nil {
log.Fatal(err)
}
//very weird that I get index out of range if I insert a var
src :=[]byte(str+"\n\n\n")
var enc [512]byte
cipher.Encrypt(enc[0:],src)
fmt.Println("Encoded",enc)
var decrypt[8] byte
cipher.Decrypt(decrypt[0:],enc[0:])
result:=bytes.NewBuffer(nil)
result.Write(decrypt[0:8])
fmt.Println(string(result.Bytes()))
}
我不明白这个问题
答案 0 :(得分:3)
虽然使用Go Blowfish可能会导致错误,但这是正确的。 Blowfish是一个64位(读取8字节)块密码。正如您所发现的,您的字符串不仅必须是带填充的8个字节,而且您要加密的任何数据都必须填充,以便所有块都等于8个字节。
为此,您应该检查数据的模数,并填充余数,以便数据的长度是8的倍数,就像这样。
var cube1, geo1, mat1;
function newbox2(){
geo1 = new THREE.BoxGeometry(12, 4, 2);
mat1 = new THREE.ShaderMaterial( {
uniforms: {
col: { type: 'f', value: 1.0 },
},
vertexShader: "void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position.x+5.0, position.y, position.z+25.0, 1.0); }",
fragmentShader: "uniform float col; void main() {gl_FragColor = vec4(col, 0.58, 0.06, 1.0);}"
});
cube1 = new THREE.Mesh(geo1, mat1);
scene.add(cube1);
cube1.position.set(5, 5, 10);
}
答案 1 :(得分:0)
看起来我发现了什么问题。 cypher.Encrypt接受长度为8的字节数组。但字节数组[]字节(str +“\ n \ n \ n”)的长度为4.这就是为什么我得到一个超出范围的索引。如果我有一个array []字节(“我的str编码”+“\ n \ n \ n \ n”)。它的len是2个字符串的len。现在的解决方案是添加更多\ n字符,使数组的长度为str +“\ n ...... \ n”> => 8