Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ColdFusion或相当于PHP加密/解密的Java_Java_Php_Algorithm_Encryption_Coldfusion - Fatal编程技术网

ColdFusion或相当于PHP加密/解密的Java

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之间 为

我有一个API规范,内容如下:

加密算法

API使用AES-128(也称为Rijndael-128)算法,该算法的密钥为192位 敏感信息加密和解密的CBC模式–用户/登录和用户/注册方法中的密码参数、身份验证令牌等。算法步骤如下所示:

加密

  • 填充输入数据,使其大小为加密算法块大小的倍数–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);
}