我遇到了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)));