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

我有以下用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解码器(另见在线runnable演示 ,打开并单击“执行”):

 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编码器的演示 ,我们可以看到以下结果:

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

c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0=

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

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

打印test text 123 123✔


Scala版本( 在线runnable演示 ):

 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 。 您需要一个Base64解码器,它使用RFC 4648中描述的URL安全字母表, java.util.Base64提供了(自Java 8以来)其getUrlDecoder()