要对接的接口是 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 怎么才可以加密解密出同样的数据?弄了一天还没找到可以解决的方法
1
zgcwkj 2020-09-10 16:19:57 +08:00
我不管啥语言,方法都是转成十六进制的文本进行传输,可以避免转码问题。希望能帮到你!
|
2
ben1024 2020-09-10 16:24:27 +08:00
最简单的方案协调对方提供接口
|
3
lyz1990 2020-09-10 16:40:59 +08:00
好歹给个原文
|
4
lyz1990 2020-09-10 16:41:39 +08:00
key 就是原文嘛?
|
5
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')
有结果,不知道对不对 |
6
nicevar 2020-09-10 16:55:41 +08:00
这个 java 、php 、js 我以前都做过,网上那些文章基本上就是坑,很多都是自己都没理解瞎写一通的,最好的办法就是你跟一下 java 代码,看一下内存数据,然后 php 同样跟一下,就好处理了,一般 php 问题就出在方式如 DES-EDE3-CBC 选择,还有调用 openssl_encrypt 之前的 padding 填充,再就是输出的格式,仔细一点一定能解决的
|
7
chihiro2014 2020-09-10 16:59:59 +08:00
之前遇到过,js 和 java 后台加密转换这方面的问题,可以去 git 上搜搜对应的实现
|
8
radiocontroller 2020-09-10 17:05:38 +08:00
楼主 id 有点东西
|
9
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); } |
10
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 准不准确 |
11
lxk11153 2020-09-10 17:44:19 +08:00
已解开, call d3gvcXE6IDQ0M+WWnTnkups3NDE1OQ== (8ase64)
|
12
zjwshisb OP 已经解开了,openssl_decrypt(base64_decode($input),'aes-192-cbc',1,$iv);
之前看网上都说是 aes-128-cbc,根本就不行,中间的数字根据 key 的长度来, 192 = 8 * strlen($key) 还是找到一个 composer 包里面有相关的同样的加密才解决的 |