------------------绝大多数加密方式都是在二进制的基础上进行加解密的!!!!!!!!!!!!
------------------AES-256-ECB 设置项 0返回的是base64编码!!!!!!!!!!!!
------------------AES-256-ECB 设置项 其它项返回的是二进制编码!!!!!!!
-----------------AES-256-ECB 设置项 最好别用0,避免编码出错!!!!!
我方使用php语言,对方使用java,加解密模式为AES-256-ECB
php 自带加密函数
$dataJson //待加密json字符串
$cipher //加密方式 ECB模式接受 'AES-128/192/256-ECB'中间数字代表密钥(位)16/24/32字节 也就是密钥长度*8 128长度16*8 一个英文字母占1字节,1字节(byte)=8位(b) ,
$aesKey //密钥,php中密钥(位)通常和加密方式(位)相同,如果密钥(位)大于加密方式(位),如果密钥(位)大于加密方式(位)则只会取加密方式(位)相同,密钥32字节(256位),加密方式128,只会取前16字节作为加密密钥,密钥(位)少于加密方式(位)会报错,
$option //补码方式 注意 0和1的区别
- 0 //pkcs7/5补码 返回的是base64编码,
- OPENSSL_RAW_DATA=1 //pkcs7/5补码 返回的是二进制编码,
- OPENSSL_ZERO_PADDING=2 //pkcs0补码 返回的是二进制编码
- OPENSSL_NO_PADDING=3 //不填充补码 返回的是二进制编码
// 加密业务数据
$encryptedData = openssl_encrypt($dataJson, $cipher, $aesKey, $option);
========注意要点==================
php通过此加密方式传输数据,需要与对方确定的是:
1.加密方式,
2.密文编码方式 (base64,2进制,16进制)
--------------不管什么方式最原始的加解密数据一定要是二进制!!!!!!!!------------------
3.补码方式,如果补码方式不是该函数自带的需要另外手动补码--自己查资料
==============问题描述=====================
通常对接java接口对方一般也就是base64编码,也就是openssl_encrypt($dataJson, $cipher, $aesKey, 0); 或者 base64_encode(openssl_encrypt($dataJson, $cipher, $aesKey, OPENSSL_RAW_DATA)),-----也就是 直接转base64和先二进制再转base64的区别
1.密钥问题:5ef5689475bdfca33fb92d7b3a8657cfd287de9a895d8f534cba9ad46115f279---64字节??比最大的32位还长,,为什么呢,,(后来询问才知道对方是用的16进制,需要先把密钥转byte[]32(32字节),)密钥是16进制需要先把密钥用---hex2bin---转为二进制,一个16进制数代表4个二进制也就是4位,所以16进制转二进制之后字节减半;
2.加解密过程的转码问题,对方要求的密文是 加密后转16进制---用此函数bin2hex---,起初我用的是bin2hex(openssl_encrypt($dataJson, $cipher, $aesKey, 0)),怎么解密都不对,最后用bin2hex(openssl_encrypt($dataJson, $cipher, $aesKey, OPENSSL_RAW_DATA))成功了,,原因在于,绝大多数加密方式都是再二进制编码的基础上进行加解密的, 0的时候返回的是base64编码的数据,所以对方得到之后解密永远是失败的,而OPENSSL_RAW_DATA返回的是二进制编码 所以成功了