我需要加密一个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解密相关推荐

  1. java gradle构建_在Gradle中为JPMS构建Java 6-8库

    java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...

  2. java方法重载_在Python中该如何实现Java的重写与重载

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...

  3. java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务

    java pojo使用 大多数嵌套事务是使用EJB实现的,现在我们尝试在POJO上实现嵌套事务. 在这里,我们使用了ThreadLocal的功能. 了解嵌套事务 事务可以嵌套在另一个内部. 因此,内部 ...

  4. java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?

    首先要说明一点,Java线程的实现是基于底层系统的线程机制来实现的,程序中开的线程并不全部取决于JVM虚拟机栈,而是取决于CPU,操作系统,其他进程,Java的版本.JVM的线程与计算机本身性能相关. ...

  5. maven项目密码md5加密_加密Spring Boot中的application.properties

    1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? (虽然是小项目,明文也没人看.) (明文简单快捷方便啊!!! ) (你看直接用户名root密码123456多么简单!! ...

  6. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  7. ubuntu chrome java插件_在Ubuntu中为Chrome安装Java插件

    问题描述 我有JDK,在Ubuntu中一切正常,我是说IDE,一些应用程序,我能够开发和运行项目,但是我在Chrome中收到一条消息:Java(TM) is required to display t ...

  8. java与python多态的区别_如果未调用父构造函数(与Java不同),多态性在Python中如何工作? - java...

    因此,父类构造函数是在Java中调用的,而在Python中则不是.如果这意味着未创建父对象,那么如何在Python中成功调用def function-这是怎么回事? Python代码 class Pa ...

  9. jsp页面导入java包能干嘛_在JSP中如果要导入java.util.*包要使用什么指令

    [判断题]扶梯满载上行时,所需总功率等于驱动梯级所需的功率乘以传动总效率. [判断题]电梯制动器闸瓦应均匀,其四角处间隙平均值两侧各不大于0.7mm. [多选题]以下()触点断开会使MC线圈断电. [ ...

  10. oracle java赋予执行_在oracle中执行java例程

    oracle10g的oralceJVM支撑java1.4. 这让我们能用java做一些ps/sql不容易处理的任务,比如访问http资源等.这篇文章写个实例.首先创建java源码,所有method必须 ...

最新文章

  1. 【动画1】UIView动画
  2. 如何一夜暴富?这里有一份比特币价格预测指南
  3. 北京迎“豪宅元年”:四环房价将迈入8万元时代
  4. 获取个人借阅信息---图书馆client
  5. [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL
  6. linux svn 拉取代码_svn快速入门指南
  7. python的多线程适合计算密集操作_Python 多线程操作学习
  8. 再谈IE的浏览器模式和文档模式[转]
  9. c# winform 让Form窗体上系统自带的红色关闭按钮失效,点击关闭变为隐藏
  10. 下载 Chrome插件 crx的教程
  11. JavaScript判断数组的几种方法
  12. 希尔排序、快速排序的每一趟
  13. WinForm——MDI窗体
  14. Coinbase 研究:Web3 开发者堆栈指南
  15. 计算机桌面闪烁,电脑屏幕总是闪烁怎么办?这样就能解决
  16. 主目录中文路径名转英文
  17. numpy.meshgrid()理解
  18. 【基础】银行间市场金融设施
  19. 十一.再函数进阶+requests网络爬虫
  20. 盲盒包装流水线(数据结构实践-栈)

热门文章

  1. 临床基因组学数据分析实战开课啦!!!
  2. 方法革新:8个宏基因组分析新工具 | 热心肠日报
  3. 面对这些情况,要勇于说“不​”
  4. QIIME 2用户文档. 13数据评估和质控Evaluating and controlling(2018.11)
  5. oracle增量 mysql_是否有任何mysql / Oracle函数给予增量号。基于另一列相似值的一列?...
  6. pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值
  7. python使用matplotlib可视化使用subplots子图、subplots绘制子图、并为可视化的每个子图添加标题(title for each subplots)
  8. Python使用matplotlib可视化绘图时你可用的颜色有哪些?把色彩可视化出来自己选好了
  9. R线性回归模型构建示例
  10. 广义线性模型、Logistic、sigmoid、softmax、多分类、与大数据、优缺点