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

2023-12-12

我用 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 解码器(另请参阅在线可运行演示,打开并单击“执行”):

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);
}

凯文在评论中提出这个演示原始 Go 编码器的结果,我们可以看到以下结果:

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

is c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0=.

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

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

Prints test text 123


斯卡拉版本(在线可运行演示):

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().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang 中的 AES 加密和 Java 中的解密 的相关文章

随机推荐

  • NES(6502组装)精灵动作

    我目前正在开发 NES 6502 组装游戏 但我不明白如何使精灵移动 我认为它应该是这样工作的 loop LDA 200 will load into the A register the content of address 200 wi
  • IntelliJ:使用 docker jvm 还是 docker maven?

    我有一个 docker jvm 实例 我从命令行使用它来编译和运行 java 代码 IntelliJ 的项目配置要求我指向文件系统上的 jvm 所以 我想知道 我可以配置intellij来使用这个docker容器吗 我想我可以配置一个 do
  • Socket.io 客户端:用一个处理程序响应所有事件?

    是否可以让 socket io 客户端响应所有事件 而无需单独指定每个事件 例如 像这样的东西 显然现在不起作用 var socket io connect http myserver socket on function listen t
  • 为什么 C++ 中析构函数运行两次?

    在做编程作业时 我似乎在基本的 C 概念上遇到了困难 我在程序中发现了该错误 这是由于我的析构函数运行次数超出了我的预期造成的 这是一个代码示例 演示了我做错了什么 直到最基本的部分 include
  • 添加/提交文件到所有分支

    假设我在一个分支上并且索引是脏的 我对文件 x 进行了更改 并且还进行了一些其他更改 有没有办法将文件 x 添加到所有现有分支 像这样的东西 usr bin env bash current branch git rev parse abb
  • 复杂的 git rebase 操作

    看着git rebase手册页 我没有看到任何看起来像我想要的图表 除了有些图表似乎做了与我想要的相反的事情 并且玩弄 onto也没有得到我想要的 让我看看是否可以画出像图中那样的图表git rebase手册页 左侧的竖线是为了使 Mark
  • 如何使用 python 访问 Azure AD 组和用户详细信息?

    params urllib urlencode Specify values for the following required parameters api version 1 5 tenant id vvvvvvvvXXXXXX he
  • Java 中的调度异常

    我正在开发一个任务 需要从给定的 URL 下载文件 其中一个要求是它可以处理网络故障和异常 在我的实现中 我有一个 DonwloadManager 为每个 URL 分配一个线程 以免阻塞 问题是我不确定如何通过代码模拟失败和异常 我尝试使用
  • 如何为 Cydia 和越狱的 iPhone 开发应用程序

    我开始为 iPhone 开发应用程序 我想开发一个特定的应用程序 但苹果肯定会拒绝它 所以我想为 Cydia 开发它 因为我认为它很有用 我试图弄清楚如何使用 Theos 和 XCode 来创建我的应用程序 但我什么都不懂 如果你们中的一些
  • Rails 基于对象的权限/授权引擎?

    我想在我的应用程序中添加 共享文档 功能 就像在谷歌文档服务中一样 据我所知 用户可以 可以列出 查看 创建 编辑 删除自己的文档 与所有人共享自己的文档 它是公共文档 将自己的文档共享给具有只读访问权限的其他用户 将自己的文档共享给具有读
  • 如何从 JSON 对象中删除包装器?

    我有一个带有包装器的 JSON 对象 其中包含有关它来自的服务的信息 在解析我真正关心的对象之前 我想去掉包装器 然后只解析该对象 我如何转换这个 JSON 对象 object id object 1 description Black o
  • 有没有API可以同时获取后置和前置摄像头视图? [复制]

    这个问题在这里已经有答案了 我需要在一个显示器上显示后置摄像头和前置摄像头 是否可以同时显示两者 有没有可以同时获取两个视图的API 与单相机相同 只是双相机 两个 SurfaceHolder 和两个 Camera 实例 http deve
  • TLS 扩展“服务器名称指示”(SNI):值在服务器端不可用

    基于 JSSE 示例 我尝试在服务器端获取 TLS 参数 服务器名称指示 SNI 的值 但没有成功 我确信该值是由客户端发送的 因为我使用了显示该值的网络嗅探器 Wireshark 但是当我使用以下代码片段时 服务器名称参数列表为空 同时显
  • 在令牌后触发的 jQuery 自动完成插件

    我正在构建一个应用程序 并且希望在文本区域内进行自动完成 就像 Twitter Facebook 使用 name 所做的那样 但是 我希望在输入 TID x 时触发它 其中 x 是任意长度的整数 看来 Twitter Facebook 在您
  • Google 电子表格 CTRL+Shift+E

    我有两张纸的电子表格 current sheet and archive sheet 我还有一个脚本 我创建的 可以从中删除数据current sheet并将其附加到archive sheet每月一次 The sheets have an
  • 使用FutureBuilder时如何只获取一次数据?

    我有一个获取请求 我将其作为未来传递给 FutureBuilder FutureBuilder future gettask builder context snapshot if snapshot hasData Stopwatch st
  • 如何解决 Mvc 中没有为此对象定义无参数构造函数错误?

    我正在创建一个演示应用程序来学习如何使用存储库模式来执行插入操作 我正在使用 Nop Commerce http www nopcommerce com 存储库模式的代码 Error 没有为此对象定义无参数构造函数 我看过这个链接 MVC
  • 哪个应该首先运行 git submodule update 或 git submodule init ?

    我在这里看到 https github com UCSD PL proverbot9001 issues 73 run git submodule update and the makes sure init is only ran if
  • 从 url 中删除“index.html”并使用单个 301 重定向添加“www”

    为了去除index html or index htm从网址我在我的中使用以下内容 htaccess RewriteCond REQUEST URI index html NC RewriteRule index html 1 NC R 3
  • Golang 中的 AES 加密和 Java 中的解密

    我用 Golang 编写了以下 AES 加密函数 func encrypt key byte text string string plaintext byte text block err aes NewCipher key if err