ColdFusion或相当于PHP加密/解密的Java
我有一个API规范,内容如下: 加密算法 API使用AES-128(也称为Rijndael-128)算法,该算法的密钥为192位 敏感信息加密和解密的CBC模式–用户/登录和用户/注册方法中的密码参数、身份验证令牌等。算法步骤如下所示: 加密ColdFusion或相当于PHP加密/解密的Java,java,php,algorithm,encryption,coldfusion,Java,Php,Algorithm,Encryption,Coldfusion,我有一个API规范,内容如下: 加密算法 API使用AES-128(也称为Rijndael-128)算法,该算法的密钥为192位 敏感信息加密和解密的CBC模式–用户/登录和用户/注册方法中的密码参数、身份验证令牌等。算法步骤如下所示: 加密 填充输入数据,使其大小为加密算法块大小的倍数–16字节。如果输入数据的长度是16的倍数,则需要追加额外的16字节块。每个pad字节的值是作为“unsigned char”的pad字节数。也就是说,填充数据的最后一个字节应始终介于0x01和0x10之间 为
- 填充输入数据,使其大小为加密算法块大小的倍数–16字节。如果输入数据的长度是16的倍数,则需要追加额外的16字节块。每个pad字节的值是作为“unsigned char”的pad字节数。也就是说,填充数据的最后一个字节应始终介于0x01和0x10之间
- 为加密算法生成16字节长的初始化向量(IV)
- 使用AES-128和EK以及生成的IV加密填充数据
- 将IV与加密数据相结合
- 使用urlsafe Base64对结果进行编码。urlsafe Base46字母表使用“-”而不是“+”,使用“u”而不是“/”
- Base64对输入数据进行解码
- 提取前16个字节–这些是AES算法的IV
- 使用AES-128和EK和IV对数据进行解密
- 读取解密数据的最后一个字节的值,并从其尾部删除许多字节
该API的供应商提供的唯一示例是PHP,使用mcrypt。我对PHP一无所知,也不是加密专家。我需要能够使用ColdFusion 10表示上述算法 我首先尝试以示例PHP文件为例,在ColdFusion标记或函数库中查找等价项,然后查找具有相同接口的Java库。我只是不知道如何让这一切发生 这里是否有人可以为我指出正确的方向,或与我脱机工作以提供帮助 编辑: 这里给出了一个示例,用于对提供给我用于API的密钥(合作伙伴密钥和加密密钥)进行“检查”的基本任务 对象Client.php,具有以下构造函数:
public function __construct($hostApiUrl, $partnerKey, $encryptionKey, $token = null)
{
$this->_pk = $partnerKey;
$this->_ek = $encryptionKey;
$this->_crypt = new Crypt($encryptionKey);
$this->_url = rtrim($hostApiUrl, '/') . self::BASE_URL;
if ($token) {
$this->setUserSession($token);
}
}
这就是我尝试使用的函数:
public function checkKeys()
{
$secret = $this->_encodeParam($this->_ek);
$result = $this->call('partner/checkkeys', array(
'secret' => $secret
));
if (!$result || !$this->_isCodeOk($result->code)) {
return false;
}
return true;
}
显然,调用此方法时,客户机对象已经具有伙伴密钥和加密密钥
因此,“秘密”是通过使用_encodeParam()方法对提供的加密密钥进行“编码”而创建的。看起来是这样的:
protected function _encodeParam($secret)
{
$secret = "{$secret}:{$this->_pk}";
return $this->_crypt->encrypt($secret);
}
所以这个秘密被附加在伙伴密钥之后。然后在crypt对象中使用此方法进行加密(AES_BLOCK_SIZE设置为16):
这将返回到上面的checkKeys()函数,该函数将请求发送到API,然后API返回响应。这个实际的API调用是一个POST,当然很容易生成,但是所有这些加密环,包括MCRYPT库调用,都是我在尝试确定CF10或Java中的等价物时遇到的问题
如果到目前为止我得到了一个示例,我想我有机会复制crypt对象中的其他函数(这些函数甚至是必需的,但可能不是,因为有些函数可能直接构建到CF encrypt()和decrypt()函数中)。然而,这似乎是一个合理的起点。所描述的填充是PKCS5/PKCS7填充。一个或另一个将可用。在Java中,您需要
AES/CBC/pkcs5pdadding
。您可以通过指定任务的哪些部分有困难来帮助我们。rossum评论+1。回复:在Java中,您需要AES/CBC/pkcs5pdadding
。。由于CF在java上运行,您可以将其与内置的encrypt\decrypt()
函数一起使用。在上搜索示例。它们可能需要调整,但应该提供一个良好的起点。重要提示:要使用大于128位的密钥,您需要安装。密钥大小仅为128位,因此看起来一切正常。除此之外,我想我还需要发布他们提供的第一个示例(checkKeys()),它联系api并验证他们提供的加密密钥和合作伙伴密钥。我想一旦我完成了这个简单的任务,我就可以开始尝试从那里构建其他功能了。一个完整的例子会有所帮助。显然,不要发布您的真实键,只发布示例值。好的,我将很快将其添加到示例中。
public function encrypt($data)
{
$pad = self::AES_BLOCK_SIZE - strlen($data) % self::AES_BLOCK_SIZE;
$data .= str_repeat(chr($pad), $pad);
if (stristr(PHP_OS, 'win') !== false) {
$random_source = MCRYPT_RAND;
} else {
$random_source = MCRYPT_DEV_URANDOM;
}
$iv = mcrypt_create_iv(self::AES_BLOCK_SIZE, $random_source);
mcrypt_generic_init($this->_td, $this->_key, $iv);
$data = $iv . mcrypt_generic($this->_td, $data);
mcrypt_generic_deinit($this->_td);
return self::urlsafe_b64encode($data);
}