首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua和Java计算的AES加密结果是不一致的。

Lua和Java计算的AES加密结果是不一致的。
EN

Stack Overflow用户
提问于 2021-12-29 18:09:20
回答 1查看 279关注 0票数 0

背景: java有一组现成的代码,现在需要迁移到lua .

测试时:使用相同的键

key = "1938703285589872452";

data = "111111";

1.java的加密代码

pom

代码语言:javascript
复制
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.55</version>
    </dependency>

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.55</version>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>

代码

代码语言:javascript
复制
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PKCS7Padding;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

// ... 

// 加密方法
    public static String encryptWithBC(String data, String key) throws Exception {
        // key
        ByteBuffer keyBuffer = ByteBuffer.allocate(32);
        keyBuffer.put(key.getBytes());
        KeyParameter keyParameter = new KeyParameter(keyBuffer.array());
        // 请求数据
        byte[] dataByteArr = data.getBytes(StandardCharsets.UTF_8);

        // init
        CBCBlockCipher aes = new CBCBlockCipher(new AESEngine());
        PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(aes, new PKCS7Padding());
        cipher.init(true, keyParameter);

        byte[] output = new byte[cipher.getOutputSize(dataByteArr.length)];
        int len = cipher.processBytes(dataByteArr, 0, dataByteArr.length, output, 0);
        cipher.doFinal(output, len);

        return Base64.encodeBase64String(output);
    }

2.lua的加密码

代码语言:javascript
复制
-- AES加密
local aes = require "resty.aes"

-- ...

-- 加密方法
function _M.encrypt_128_cbc_pkcs7(en_data, aes_key)
    --local aes_256_cbc_with_padding = aes:new(key, nil, aes.cipher(256,"cbc"), {iv = string.sub(key, 1, 16)}, nil, nil, enable_padding)
    local aes_128_cbc_pkcs7 = aes:new(aes_key, nil, aes.cipher(128, "cbc"), nil, nil, nil, "PKCS7")
    local encrypted = aes_128_cbc_pkcs7:encrypt(en_data)
    -- 转base64
    local encrypted_base64 = wkg_hex_utils.str_to_base64(encrypted)
    local encrypted_hex = wkg_hex_utils.base64_to_hex(encrypted_base64)


    wkg_log_utils.log("AES加密结果(BASE64): {}", encrypted_base64)
    wkg_log_utils.log("AES加密结果(Hex): {}", encrypted_hex)
    return encrypted_base64
end

Lua是一个参考git:https://github.com/openresty/lua-resty-string

我只能看到cbc和pkcs7Padding的信息,但是现在结果值完全错误了。

lua的结果:

代码语言:javascript
复制
111111
X32vI7ROqoK3hjQ9fvrOKg==
5F7DAF23B44EAA82B786343D7EFACE2A

java的结果:

代码语言:javascript
复制
111111
dA8O3S8ApkzypCudVFj5ZA==
740F0EDD2F00A64CF2A42B9D5458F964

两种语言对base64的处理是相似的。

java:

代码语言:javascript
复制
    public static String base64ToHex(String base64Str) {
        byte[] decode = Base64.decode(base64Str);
        return byteArrToHex(decode).toUpperCase(Locale.ROOT);
    }

卢阿:

代码语言:javascript
复制
    function wkg_hex_utils.base64_to_hex(base64_str)
    local temp = ngx.decode_base64(base64_str)
    wkg_log_utils.log("base64解码类型: {},值: {}", type(temp), temp)
            return wkg_hex_utils.str_to_hex(temp)
    end

没有方向。我希望你能给我一些指导。谢谢。

现在,我正在尝试将加密的结果转换为byteArr。他们是这样的。

java:

代码语言:javascript
复制
[116, 15, 14, -35, 47, 0, -90, 76, -14, -92, 43, -99, 84, 88, -7, 100]

卢阿:

代码语言:javascript
复制
[95, 125, 175, 35, 180, 78, 170, 130, 183, 134, 52, 61, 126, 250, 206, 42]

有人能帮我回答吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-07 02:11:57

首先,我想告诉您,您在Java中所做的是使用PKCS7填充的AES-256-CBC加密。数字256是以位为单位的键长,这意味着在Java代码中使用的是32个字节。

代码语言:javascript
复制
local aes = require "resty.aes"
local str = require "resty.string"
local key = '1938703285589872452'

local aes_java = aes:new(key .. string.rep('\0', 32-#key), nil,
  aes.cipher(256,"cbc"), { iv = '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' })
ngx.say(str.to_hex(aes_java:encrypt('111111')))
-- output: 740f0edd2f00a64cf2a42b9d5458f964

由于您的密钥比所需的32字节短,我们需要附加零才能获得AES-256-CBC加密中使用的真正密钥。还有一点,必须指定iv向量才能实现PKCS7填充。在Java中,我认为PaddedBufferedBlockCipher为您生成默认的iv向量,但是对于Lua,您必须将默认的iv向量传递给aes:new

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70523285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档