关于 PHP 和 Java 的加密解密问题,困扰一天了

2020-09-10 16:12:47 +08:00
 zjwshisb

要对接的接口是 java 写的,其中加密的代码是

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_PKCS5);
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes(CHARSET_ENCODING));
rtnStr = Base64.encodeBase64String(encrypted);

其中
key:999c09e1ba2e4dccb44aaf8d;
iv:c4881489376b4d12;
加密方式:AES/CBC/PKCS5Padding
加密后的密文是:odnPsVDQN6vBY5JZGwRFkTfmvfJ9tXjRwpu7IFL+YrgHJH7ctSXfjSQO36KZAuVpLqEB9X9fLIZauCjyUXrsUIYBX5KJmH/kksSU+us+bv+6RzrWmJmUJBiUnBBuBFbWPOHl4if54x0N3qwAZCp3vYDiQzAFSSQKSQ+Pz/gZRd/YdLxhMsPAQyv4VWDbNrk+9L1EtDOzgUfgDWxoK4ajjA==
用 Php 怎么才可以加密解密出同样的数据?弄了一天还没找到可以解决的方法

1474 次点击
所在节点    PHP
14 条回复
zgcwkj
2020-09-10 16:19:57 +08:00
我不管啥语言,方法都是转成十六进制的文本进行传输,可以避免转码问题。希望能帮到你!
ben1024
2020-09-10 16:24:27 +08:00
最简单的方案协调对方提供接口
lyz1990
2020-09-10 16:40:59 +08:00
好歹给个原文
lyz1990
2020-09-10 16:41:39 +08:00
key 就是原文嘛?
wangritian
2020-09-10 16:45:15 +08:00
openssl_decrypt('odnPsVDQN6vBY5JZGwRFkTfmvfJ9tXjRwpu7IFL+YrgHJH7ctSXfjSQO36KZAuVpLqEB9X9fLIZauCjyUXrsUIYBX5KJmH/kksSU+us+bv+6RzrWmJmUJBiUnBBuBFbWPOHl4if54x0N3qwAZCp3vYDiQzAFSSQKSQ+Pz/gZRd/YdLxhMsPAQyv4VWDbNrk+9L1EtDOzgUfgDWxoK4ajjA==', 'AES-128-CBC', '999c09e1ba2e4dccb44aaf8d', 2, 'c4881489376b4d12')
有结果,不知道对不对
nicevar
2020-09-10 16:55:41 +08:00
这个 java 、php 、js 我以前都做过,网上那些文章基本上就是坑,很多都是自己都没理解瞎写一通的,最好的办法就是你跟一下 java 代码,看一下内存数据,然后 php 同样跟一下,就好处理了,一般 php 问题就出在方式如 DES-EDE3-CBC 选择,还有调用 openssl_encrypt 之前的 padding 填充,再就是输出的格式,仔细一点一定能解决的
chihiro2014
2020-09-10 16:59:59 +08:00
之前遇到过,js 和 java 后台加密转换这方面的问题,可以去 git 上搜搜对应的实现
radiocontroller
2020-09-10 17:05:38 +08:00
楼主 id 有点东西
aeo13
2020-09-10 17:15:21 +08:00
之前做过类似的,加密方式也是 AES/CBC/PKCS5Padding,你试试看我的方法

private $iv = "1234567890123456";//密钥偏移量 IV,可自定义
private $encryptKey = "mtz44tvgegjl9mjy";//AESkey,可自定义

//加密
public function encrypt($encryptStr) {
$localIV = $this->iv;
$encryptKey = $this->encryptKey;

//Open module
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);

//print "module = $module <br/>" ;

mcrypt_generic_init($module, $encryptKey, $localIV);

//Padding
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($encryptStr) % $block); //Compute how many characters need to pad
$encryptStr .= str_repeat(chr($pad), $pad); // After pad, the str length must be equal to block or its integer multiples

//encrypt
$encrypted = mcrypt_generic($module, $encryptStr);

//Close
mcrypt_generic_deinit($module);
mcrypt_module_close($module);

return base64_encode($encrypted);

}
cbasil
2020-09-10 17:35:41 +08:00
php 用 openssl 解密就可以了。
openssl_decrypt(base64_decode($input),'AES-128-ECB',1,$iv);
问一下对方 CIPHER_ALGORITHM_PKCS5 对应的字符串是哪个?检查一下加密方式是不是 AES/CBC/PKCS5Padding,key 准不准确
lxk11153
2020-09-10 17:44:19 +08:00
已解开, call d3gvcXE6IDQ0M+WWnTnkups3NDE1OQ== (8ase64)
zjwshisb
2020-09-10 17:54:14 +08:00
已经解开了,openssl_decrypt(base64_decode($input),'aes-192-cbc',1,$iv);
之前看网上都说是 aes-128-cbc,根本就不行,中间的数字根据 key 的长度来, 192 = 8 * strlen($key)
还是找到一个 composer 包里面有相关的同样的加密才解决的
zpfhbyx
2020-09-10 18:04:50 +08:00
@zjwshisb 我记得是填充的问题。5 对应的是 0
gz911122
2020-09-11 11:42:26 +08:00
@zgcwkj 什么乱七八糟的...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/705838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX