PHP mcrypt 3DES 168bytes密钥:加密字符串不能由JAVA解密

时间:2014-09-25 02:27:18

标签: java php encryption 3des

我遇到了PHP的3DES问题。我正在做一个可以访问银行内部界面的项目。他们用java开发了一个接口。 该接口的一个功能是银行系统将从我的服务器获取公共RSA密钥。银行方面是客户。他通过HTTP协议访问我的服务器。他们要求RSA公钥由3DES加密。 3DES的关键是" 1000000200YYMMDD"。他们要求结果按字节流发回。

我从网上下载了几个3DES程序。他们可以获得加密的字符串。但他们都在银行方面失败了。响应是"字符串索引超出范围"。我认为这条消息只是系统消息,并且几乎没有调试价值。 以下是我的计划。

我有几个关于这个问题的问题。

1,许多材料表示3DES密钥的长度最大为168字节。如何将我的密钥扩展到那个长度。我的意思是" 1000000200YYMMDD"的关键只有16个字符,如何转换为168字节。

2,3DES加密中PHP和JAVA的区别是什么。

3,我应该选择哪种街区模式?欧洲央行?加拿大广播公司?

4,我应该使用什么样的填充?

//encrypt method 1
public function DESencrypt($str)
{  
    if ($this->mcrypt == MCRYPT_DES) $str = $this->_pkcs5Pad($str);  
    $block = mcrypt_get_block_size($this->mcrypt, $this->mode);  
    $pad = $block - (strlen($str) % $block);  
    $str .= str_repeat(chr($pad), $pad);  
    $result = mcrypt_encrypt($this->mcrypt, base64_encode($this->des_key), $str, $this->mode);
    return $result;  
}  
//encrypt method 2

public function encrypt_1($input)
{  
    $td = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'ecb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $this->des_key, $iv);
    $encrypted_data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $encrypted_data;
}
//encrypt method 3
function encrypt($str)  
{  
       $block = mcrypt_get_block_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB);  
       $pad = $block - (strlen($str) % $block);  
       $str .= str_repeat(chr($pad), $pad);  
       return mcrypt_encrypt(MCRYPT_3DES, $this->des_key, $str, MCRYPT_MODE_ECB);  
} 
//encrypt method 4
public function  encrypt_2($input)
{
    $key = $this->des_key.$this->des_key;
    $tripleKey = substr($key, 0, mcrypt_get_key_size($this->mcrypt, $this->mode));
    $blocksize = mcrypt_get_block_size($this->mcrypt, $this->mode);
    $paddingSize = $blocksize - (strlen($input) % $blocksize);
    $input .= str_repeat(chr($paddingSize), $paddingSize);
    $encodedText = mcrypt_encrypt($this->mcrypt, $tripleKey, $input, $this->mode);
    return $encodedText;
}


///the main function
$des_key="1000000200YYMMDD";
///Initialize the encrypt class
$c = new Xcrypt($des_key);
/// Set the encrypt algorithm to 3DES
$c->setMcrypt(MCRYPT_3DES);
/// Get the RSA public key
$pub = $c->get_ZGSC_public();
// here I will encrypt the RSA key, I had used all the four method above, but all failed
$encyt_pub = $c->encrypt_2($pub);
///return to the client in byte stream.
file_put_contents("php://output", getBytes(base64_encode($encyt_pub)));

0 个答案:

没有答案