1、3DES加解密方案
加密:
工作中需要对接第三方数据源,总是要涉及数据的加解密。
其中一个demo中使用了php的mcrypt函数库,但是php7版本就不建议使用,所以采用openssl代替之。
首先用mcrypt的方式加密数据:
$size = mcrypt_get_block_size ( MCRYPT_3DES, 'ecb' );
$input = self::pkcs5_pad ( $input, $size );
$key = str_pad ( $sKey, 24, '0' );
$td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' );
$iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
@mcrypt_generic_init ( $td, $key, $iv );
$data = mcrypt_generic ( $td, $input );
mcrypt_generic_deinit ( $td );
mcrypt_module_close ( $td );
$data = base64_encode ( $data );
后面用openssl的方式代替:
$input = self::pkcs5_pad ( $input, 8 );
if(strlen($input) % 8){
$input = str_pad($input,strlen($input) + 8 - strlen($input) % 8,"\0");
}
$encrypted_data = openssl_encrypt($input,'DES-EDE3',$sKey,OPENSSL_RAW_DATA|OPENSSL_NO_PADDING,'');
return base64_encode($encrypted_data);
其中的pkcs5_pad函数如下:
private static function pkcs5_pad($text, $blocksize) {
$pad = $blocksize - (strlen ( $text ) % $blocksize);
return $text . str_repeat ( chr ( $pad ), $pad );
}
解密:
mcrypt方式:
public static function decrypt($encrypted, $sKey) {
$encrypted = base64_decode ( $encrypted );
$key = str_pad ( $sKey, 24, '0' );
$td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' );
$iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
$ks = mcrypt_enc_get_key_size ( $td );
@mcrypt_generic_init ( $td, $key, $iv );
$decrypted = mdecrypt_generic ( $td, $encrypted );
mcrypt_generic_deinit ( $td );
mcrypt_module_close ( $td );
$y = self::pkcs5_unpad ( $decrypted );
return $y;
}
openssl替换方案:
public static function decrypt($encrypted,$sKey){
$decrypted = openssl_decrypt(base64_decode ( $encrypted ),'DES-EDE3',$sKey,OPENSSL_RAW_DATA|OPENSSL_NO_PADDING,'');
return self::pkcs5_unpad ( $decrypted );
}
其中 pkcs5_unpad 函数如下:
private static 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 );
}
2、keytool工具生成公私密钥
第三方提供的bat文件中使用java的工具keytool生成的,重点语句是:
keytool -genkey -alias %KS_ALIAS% -dname %CLIENT_DN% -keypass %KS_PASS_CLIENT_K_Key% -storepass %KS_PASS_CLIENT_K_Key% -keystore %KEY_FILE% -keyalg RSA -validity 72000 -keysize 2048
keytool -export -alias %KS_ALIAS% -file %CER_FILE% -storepass %KS_PASS_CLIENT_K_Key% -keystore %KEY_FILE% -rfc
其中%%的都是bat脚本中自定义的变量,通过以上两句命令会生成一个cer的公钥和jks的文件。
目标:
因为是php脚本所以使用的是pem格式的证书,所以需要将jks文件生成出pem的私钥。
步骤一:将jks转换成pkcs12格式的(.p12后缀)
keytool -importkeystore -srckeystore credoo_stg.jks -destkeystore credoo_stg.p12 -srcstoretype jks -deststoretype pkcs12
步骤二:通过openssl工具将pkcs12转换成pem格式
openssl pkcs12 -in credoo_stg.p12 -out credoo_stg.pem