gpt4 book ai didi

java - Golang中的AES加密和Java中的解密

转载 作者:IT王子 更新时间:2023-10-29 01:27:50 27 4
gpt4 key购买 nike

我有以下用 Golang 编写的 AES 加密函数。

func encrypt(key []byte, text string) string {
plaintext := []byte(text)

block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}

ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}

stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)

return base64.URLEncoding.EncodeToString(ciphertext)
}

我很难理解使用 Java 解密生成的文本的流程。任何帮助将不胜感激!

这是Scala代码,不知道有什么问题。

def decode(input:String) = {
val keyBytes = Hex.decodeHex("someKey".toCharArray)
val inputWithoutPadding = input.substring(0,input.size - 2)
val inputArr:Seq[Byte] = Hex.decodeHex(inputWithoutPadding.toCharArray)

val skSpec = new SecretKeySpec(keyBytes, "AES")
val iv = new IvParameterSpec(inputArr.slice(0,16).toArray)
val dataToDecrypt = inputArr.slice(16,inputArr.size)

val cipher = Cipher.getInstance("AES/CFB/NoPadding")
cipher.init(Cipher.DECRYPT_MODE, skSpec, iv)
cipher.doFinal(dataToDecrypt.toArray)
}

最佳答案

Java 解码器(另见 online runnable demo ,打开并单击“执行”):

String decode(String base64Text, byte[] key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
byte[] inputArr = Base64.getUrlDecoder().decode(base64Text);
SecretKeySpec skSpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
int blockSize = cipher.getBlockSize();
IvParameterSpec iv = new IvParameterSpec(Arrays.copyOf(inputArr, blockSize));
byte[] dataToDecrypt = Arrays.copyOfRange(inputArr, blockSize, inputArr.length);
cipher.init(Cipher.DECRYPT_MODE, skSpec, iv);
byte[] result = cipher.doFinal(dataToDecrypt);
return new String(result, StandardCharsets.UTF_8);
}

Kevin 在评论中提供了原始 Go 编码器的 this demo,我们可以在其中看到结果:

encrypt([]byte("0123456789abcdef"), "test text 123")

c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0=

让我们看看上面的 Java 解码器如何处理该输入:

String text = "c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0=";
byte[] key = "0123456789abcdef".getBytes();
System.out.println(decode(text, key));

打印测试文本123


Scala 版本 ( online runnable demo ):

def decode(input:String, key:String) = {
val cipher = Cipher.getInstance("AES/CFB/NoPadding")
val blockSize = cipher.getBlockSize()
val keyBytes = key.getBytes()
val inputArr = Base64.getUrlDecoder().decode(input)
val skSpec = new SecretKeySpec(keyBytes, "AES")
val iv = new IvParameterSpec(inputArr.slice(0, blockSize).toArray)
val dataToDecrypt = inputArr.slice(blockSize, inputArr.size)
cipher.init(Cipher.DECRYPT_MODE, skSpec, iv)
new String(cipher.doFinal(dataToDecrypt.toArray))
}

def main(args: Array[String]) {
print(decode("c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0=", "0123456789abcdef"));
}

我认为 Scala 版本中唯一的错误是使用 Hex.decodeHex。您需要一个使用 URL 安全字母表的 Base64 解码器,如 RFC 4648 中所述,java.util.Base64 提供(自 Java 8 起)及其 getUrlDecoder()

关于java - Golang中的AES加密和Java中的解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37210227/

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