关于数据加解密及证书生成

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
复制代码

转载于:https://juejin.im/post/5b70ef25e51d4566542cfbb2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值