java 时间戳加密_加密PHP中的时间戳并用Java解密
我需要加密一个unix时间戳来调用第三方API . 在他们的文档中,他们指定我必须使用:
算法:128位AES,模式:CBC
填充:PKCS5Padding
初始化向量:"0000000000000000"
然后他们举个例子:
客户端必须使用时间戳1464284796,初始化向量:'0000000000000000'和密钥b35901b480ca658c8be4341eefe21a80测试其实现,这导致base64 auth_token 6BH3hg1cqQJOK6sG8gw7Xw ==
他们甚至提供示例代码来生成加密时间戳,问题是他们正在使用Java而我们正在使用PHP . 我在PHP中尝试的所有内容都与预期的输出不匹配,即6BH3hg1cqQJOK6sG8gw7Xw == .
这是他们的Java示例:
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import com.google.common.primitives.Longs;
class Encryptor {
private String initialVector;
private static final String TRANFORMATION = "AES/CBC/PKCS5Padding";
private static final String ALGORITHM = "AES";
String encrypt(SecretKeySpec key, long timestamp) throws Exception {
byte[] encryptedBytes =
getEncryptingCipher(key).doFinal(Longs.toByteArray(timestamp));
return Base64.encodeBase64String(encryptedBytes);
}
private Cipher getEncryptingCipher(SecretKeySpec key) throws
NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException,
InvalidKeyException,
InvalidAlgorithmParameterException {
Cipher encryptingCipher = Cipher.getInstance(TRANFORMATION);
encryptingCipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(initialVector.getBytes()));
return encryptingCipher;
}
private SecretKeySpec getSecretKeySpec(String key) throws DecoderException {
byte[] keyBytes = Hex.decodeHex(key.toCharArray());
return new SecretKeySpec(keyBytes, ALGORITHM);
}
void setInitialVector(String initialVector) {
this.initialVector = initialVector;
}
}
用法:
Encryptor encryptor = new Encryptor();
encryptor.setInitialVector("0000000000000000");
//Expensive operation so only performed once, re-use the key spec instance
SecretKeySpec keySpec =
encryptor.getSecretKeySpec("b35901b480ca658c8be4341eefe21a80");
long timestamp = System.currentTimeMillis() / 1000;
String authToken = encryptor.encrypt(keySpec, timestamp);
我在PHP中的尝试:
[acool@acool ~]$ php -a
Interactive shell
php > echo openssl_encrypt( '1464284796','AES-128-CBC','b35901b480ca658c8be4341eefe21a80',null,'0000000000000000');
8PM7LQM7Xmb2NCBE3Hp00g==
php >
然后:
function encrypt($message, $initialVector, $secretKey) {
return base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$secretKey,
$message,
MCRYPT_MODE_CBC,
$initialVector
)
);
}
function encrypt_something($input)
{
$size = mcrypt_get_block_size('rijndael-128', 'cbc');
$input = pkcs5_pad($input, $size);
$key = 'b35901b480ca658c8be4341eefe21a80';
$td = mcrypt_module_open('rijndael-128', '', 'cbc', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, '0000000000000000');
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
echo encrypt_something('1464284796');
//echo encrypt('1464284796','0000000000000000','b35901b480ca658c8be4341eefe21a80');
[acool@acool ~]$ php -f api.php
UXRvTOIPiiYfBUoDFRaC5w==
老实说,我对我正在做的事情一无所知,尤其是在JAVA中 . 我甚至不知道如何运行示例代码 .
UPDATE
第三方通过修改样本与我们联系:
注意:客户端必须使用时间戳1464284796,初始化向量:'0000000000000000'和密钥b35901b480ca658c8be4341eefe21a80测试其实现,这导致base64 auth_token ZnNmKbcdxRrYTDBgQKI9aQ ==
解决方案是revome pack 功能:
$ts = '1464284796';
$key = "b35901b480ca658c8be4341eefe21a80";
$authToken = openssl_encrypt( $ts, 'AES-128-CBC', hextobin($key), null, '0000000000000000');
function hextobin($hexstr)
{
$n = strlen($hexstr);
$sbin ="";
$i =0;
while($i
{
$a =substr($hexstr,$i,2);
$c = pack("H*",$a);
if ($i==0){$sbin=$c;}
else {$sbin.=$c;}
$i+=2;
}
return $sbin;
}
java 时间戳加密_加密PHP中的时间戳并用Java解密相关推荐
- java gradle构建_在Gradle中为JPMS构建Java 6-8库
java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...
- java方法重载_在Python中该如何实现Java的重写与重载
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...
- java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务
java pojo使用 大多数嵌套事务是使用EJB实现的,现在我们尝试在POJO上实现嵌套事务. 在这里,我们使用了ThreadLocal的功能. 了解嵌套事务 事务可以嵌套在另一个内部. 因此,内部 ...
- java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?
首先要说明一点,Java线程的实现是基于底层系统的线程机制来实现的,程序中开的线程并不全部取决于JVM虚拟机栈,而是取决于CPU,操作系统,其他进程,Java的版本.JVM的线程与计算机本身性能相关. ...
- maven项目密码md5加密_加密Spring Boot中的application.properties
1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? (虽然是小项目,明文也没人看.) (明文简单快捷方便啊!!! ) (你看直接用户名root密码123456多么简单!! ...
- java coin介绍_代码示例中的Java 7:Project Coin
java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...
- ubuntu chrome java插件_在Ubuntu中为Chrome安装Java插件
问题描述 我有JDK,在Ubuntu中一切正常,我是说IDE,一些应用程序,我能够开发和运行项目,但是我在Chrome中收到一条消息:Java(TM) is required to display t ...
- java与python多态的区别_如果未调用父构造函数(与Java不同),多态性在Python中如何工作? - java...
因此,父类构造函数是在Java中调用的,而在Python中则不是.如果这意味着未创建父对象,那么如何在Python中成功调用def function-这是怎么回事? Python代码 class Pa ...
- jsp页面导入java包能干嘛_在JSP中如果要导入java.util.*包要使用什么指令
[判断题]扶梯满载上行时,所需总功率等于驱动梯级所需的功率乘以传动总效率. [判断题]电梯制动器闸瓦应均匀,其四角处间隙平均值两侧各不大于0.7mm. [多选题]以下()触点断开会使MC线圈断电. [ ...
- oracle java赋予执行_在oracle中执行java例程
oracle10g的oralceJVM支撑java1.4. 这让我们能用java做一些ps/sql不容易处理的任务,比如访问http资源等.这篇文章写个实例.首先创建java源码,所有method必须 ...
最新文章
- 【动画1】UIView动画
- 如何一夜暴富?这里有一份比特币价格预测指南
- 北京迎“豪宅元年”:四环房价将迈入8万元时代
- 获取个人借阅信息---图书馆client
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL
- linux svn 拉取代码_svn快速入门指南
- python的多线程适合计算密集操作_Python 多线程操作学习
- 再谈IE的浏览器模式和文档模式[转]
- c# winform 让Form窗体上系统自带的红色关闭按钮失效,点击关闭变为隐藏
- 下载 Chrome插件 crx的教程
- JavaScript判断数组的几种方法
- 希尔排序、快速排序的每一趟
- WinForm——MDI窗体
- Coinbase 研究:Web3 开发者堆栈指南
- 计算机桌面闪烁,电脑屏幕总是闪烁怎么办?这样就能解决
- 主目录中文路径名转英文
- numpy.meshgrid()理解
- 【基础】银行间市场金融设施
- 十一.再函数进阶+requests网络爬虫
- 盲盒包装流水线(数据结构实践-栈)
热门文章
- 临床基因组学数据分析实战开课啦!!!
- 方法革新:8个宏基因组分析新工具 | 热心肠日报
- 面对这些情况,要勇于说“不​”
- QIIME 2用户文档. 13数据评估和质控Evaluating and controlling(2018.11)
- oracle增量 mysql_是否有任何mysql / Oracle函数给予增量号。基于另一列相似值的一列?...
- pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值
- python使用matplotlib可视化使用subplots子图、subplots绘制子图、并为可视化的每个子图添加标题(title for each subplots)
- Python使用matplotlib可视化绘图时你可用的颜色有哪些?把色彩可视化出来自己选好了
- R线性回归模型构建示例
- 广义线性模型、Logistic、sigmoid、softmax、多分类、与大数据、优缺点