openresty 的 aes 算法, Java 实现对不上

查看 59|回复 7
作者:dunhanson   
为啥对不上?好奇怪
1 、openresty github 官方示例
https://github.com/openresty/lua-resty-string
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_md5 = aes:new("AKeyForAES")
-- the default cipher is AES 128 CBC with 1 round of MD5
-- for the key and a nil salt
local encrypted = aes_128_cbc_md5:encrypt("Secret message!")
ngx.say("AES 128 CBC (MD5) Encrypted HEX: ", str.to_hex(encrypted))
ngx.say("AES 128 CBC (MD5) Decrypted: ", aes_128_cbc_md5:decrypt(encrypted))
2 、自己编写 lua 测试
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_md5 = aes:new("gOxiO7IIRthJ406X")
-- the default cipher is AES 128 CBC with 1 round of MD5
-- for the key and a nil salt
local encrypted = aes_128_cbc_md5:encrypt("hello")
ngx.say("AES 128 CBC (MD5) Encrypted HEX: ", str.to_hex(encrypted))
ngx.say("AES 128 CBC (MD5) Decrypted: ", aes_128_cbc_md5:decrypt(encrypted))
-- 输出结果
AES 128 CBC (MD5) Encrypted HEX: de6641e8a49ef1911a10d9ec88cc477b
AES 128 CBC (MD5) Decrypted: hello
3 、java 实现
@Test
public void testEncryptText() {
    String key = "gOxiO7IIRthJ406X";
    byte[] iv = new byte[16];
    String text = "hello";
    AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, SecureUtil.md5(key).getBytes(), iv);
    System.out.println(aes.encryptHex(text));
    // 输出:446d1192d40aa0d05e3c30392ac43ec3
    aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv);
    System.out.println(aes.encryptHex(text));
    // 输出:190ede3e1359a6e4d8ecf38c8f4bce63
}
kran   
虽然忘了具体参数,但可以匹配上。曾经做过。
kran   
```
@Provides @Singleton
private Cipher provideAESEncryptCipher(GlobalConfig config) {
var key = Base64.decode(config.getAesKey());
var cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", new BouncyCastleProvider());
var iv = config.getAesIV().getBytes(StandardCharsets.US_ASCII);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES/CBC/PKCS7Padding"), new IvParameterSpec(iv));

return cipher;
}
}
local c = aes:new(key, nil, aes.cipher(128,"cbc"), {iv="0123456789abcdef"})
local path = ngx.re.gsub(string.sub(ngx.var.uri, 2), '-', '+')
local url, err = c:decrypt(ngx.decode_base64(path))
```
dunhanson
OP
  
@kran 我用的 aes_128_cbc_md5 ,这个 iv 不知道是多少
kran   
iv 自己定的
kran   
随机 iv 我记得两边匹配不上
dunhanson
OP
  
@kran 确实,随机的匹配不上,固定的匹配上了。
但是好奇怪,随机,为啥 openresty 自己可以解密?
forvvvv123   
OP 意思是同样的 key ,同样的明文,2 和 3 结果不一样吗?
如果是这个意思的话,那是因为 cbc 模式要求有 iv ,正常的做法,每一次加密 iv 都是一个不一样的值,同样 key 同样明文,iv 不同获得的密文也不同; 接收方要解密的时候必须知道 key + iv 才能解密,一般是约定附加在密文开头或者指定另一个字段;
你这两个都没有明确设置 iv ,那得看 lua 的默认行为和 java 默认行为最终导致的进入运算的 iv 一不一样; op 可以手动设置 iv ,或者查查手册把 iv 打印出来
您需要登录后才可以回帖 登录 | 立即注册

返回顶部