gpt4 book ai didi

java - Blowfish GoLang加密与Java解密

转载 作者:IT王子 更新时间:2023-10-29 02:37:20 25 4
gpt4 key购买 nike

无法解密使用 Blowfish 在 Go 语言中加密的 Java 密文。

加密

import (
"testing"
"golang.org/x/crypto/blowfish"
"github.com/andreburgaud/crypt2go/ecb"
"github.com/andreburgaud/crypt2go/padding"
"fmt"
"encoding/base64"
)

func TestEncrypt(t *testing.T) {

bytes := []byte("cap")
key := []byte("1c157d26e2db9a96a556e7614e1fbe36")

encByte := encrypt(bytes, key)
enc := base64.StdEncoding.EncodeToString(encByte)
fmt.Printf("ENC - %s\n", enc)
}

func encrypt(pt, key []byte) []byte {
block, err := blowfish.NewCipher(key)
if err != nil {
panic(err.Error())
}
mode := ecb.NewECBEncrypter(block)
padder := padding.NewPkcs5Padding()
pt, err = padder.Pad(pt) // padd last block of plaintext if block size less than block cipher size
if err != nil {
panic(err.Error())
}
ct := make([]byte, len(pt))
mode.CryptBlocks(ct, pt)
return ct
}

// Output
// ENC - AP9atM49v8o=

解密

import lombok.SneakyThrows;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import static java.util.Base64.getDecoder;
import static java.util.Base64.getEncoder;

public class UserAuthenticationFilter {

public static void main(String[] args) throws Exception {
String key = "1c157d26e2db9a96a556e7614e1fbe36";
System.out.println(decrypt(getDecoder().decode("AP9atM49v8o="), key));

// encryption and decryption verification
// String plainText = "cap";
// String cipher = encrypt(plainText, key);
// String decrypted = decrypt(getDecoder().decode(enc), key);
// assert decrypted.equals(plainText);
}

@SneakyThrows
public static String encrypt(String plainText, String key) {
byte[] myKeyByte = hexToBytes(key);
SecretKeySpec skeySpec = new SecretKeySpec(myKeyByte, "Blowfish");
Cipher ecipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
ecipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] src = ecipher.doFinal(plainText.getBytes("ISO-8859-1"));
return getEncoder().encodeToString(src);
}

@SneakyThrows
public static String decrypt(byte[] cipherContent, String key) {
byte[] myKeyByte = hexToBytes(key);
SecretKeySpec skeySpec = new SecretKeySpec(myKeyByte, "Blowfish");
Cipher dcipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
dcipher.init(2, skeySpec);
byte[] dcontent = dcipher.doFinal(cipherContent);
return (new String(dcontent, "ISO-8859-1")).trim();
}

private static byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else if (str.length() < 2) {
return null;
} else {
int len = str.length() / 2;
byte[] buffer = new byte[len];

for(int i = 0; i < len; ++i) {
buffer[i] = (byte)Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
}

return buffer;
}
}

}

// Output
// BY x³

根据输出,GoLang 中的加密和 Java 中的解密不会生成相同的纯文本。最初以为问题可能与golang的byte(0到255)和java的base64编码解码涉及的byte(-128到127)有关。但是查看 Java 的解密代码,可以使用 value & 255 正确处理它。

在golang中解密相同的密文非常完美。 Java 中的加密和解密也可以完美运行。但不是一个加密和另一个解密。

我认为加密和解密逻辑是正确的。唯一的猜测可能是有一些特定的语言???密文移植到其他语言解密时会丢失。

最佳答案

key := []byte("1c157d26e2db9a96a556e7614e1fbe36")

我相信这段代码返回字符串本身的字节数组,而不是十六进制解码值。要获得有效 key ,您可以尝试使用 hex decoding

关于java - Blowfish GoLang加密与Java解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356504/

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