php des pkcs5,php做DES加密,仿PKCS5填充方式做自定义字符填充

首先,我们来看手册(只有很旧的手册上有)上的这一段代码,剖析了PKCS5填充过程。

function encrypt_something($input)

{

$size = mcrypt_get_block_size('des', 'ecb');

$input = pkcs5_pad($input, $size);

$key = 'YOUR SECRET KEY HERE';

$td = mcrypt_module_open('des', '', '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);

return $data;

}

//填充部分,如果block为8字节,注意当加密字节数刚好是8的整数倍,也要在结尾填充8个字节

function pkcs5_pad ($text, $blocksize)

{

$pad = $blocksize - (strlen($text) % $blocksize);

return $text . str_repeat(chr($pad), $pad);

}

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);

}

?>

PKCS5填充的是要填充的字节数,下面看我据此改造的可以填充任意字符的DES加密。

function makePattern( $key, $text )

{

$blocksize = mcrypt_get_block_size( 'des', 'ecb' );

$padn = $blocksize - ( strlen( $text ) % $blocksize );

$pad = substr( strrev( $text ), 0, 1 ); //注意此处为我自定义的填充字符

$text = $text.str_repeat( $pad, $padn );

$td = mcrypt_module_open( 'des', '', 'ecb', '' );

$iv = mcrypt_create_iv ( mcrypt_enc_get_iv_size( $td ), MCRYPT_RAND );

mcrypt_generic_init( $td, $key, $iv );

$data = mcrypt_generic( $td, $text );

mcrypt_generic_deinit( $td );

mcrypt_module_close( $td );

return base64_encode( $data );

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Python实现3DES加密(CBC模式,PKCS5填充)的示例代码: ```python from Crypto.Cipher import DES3 import base64 import hashlib from Crypto import Random def des3_encrypt(key, data): # 将密钥转换为字节流 key_bytes = key.encode('utf-8') # 将需要加密的数据转换为字节流 data_bytes = data.encode('utf-8') # 使用PKCS5进行填充 data_bytes += b"\0" * (8 - len(data_bytes) % 8) # 生成随机的IV向量 iv = Random.new().read(DES3.block_size) # 创建加密器 cipher = DES3.new(key_bytes, DES3.MODE_CBC, iv) # 使用加密器进行加密,并将结果进行base64编码 encrypted_data = base64.b64encode(iv + cipher.encrypt(data_bytes)).decode('utf-8') return encrypted_data # 测试示例 key = '12345678901234567890123456789012' data = 'Hello, world!' encrypted_data = des3_encrypt(key, data) print(encrypted_data) ``` 在上面的代码中,我们使用了Python的`Crypto`库中的`DES3`模块来实现3DES加密,采用CBC模式和PKCS5填充。首先,我们将密钥和需要加密的数据转换为字节流,然后使用PKCS5进行填充,以保证数据长度是8的倍数。接着,我们生成一个随机的IV向量,并创建一个加密器对象,使用加密器对数据进行加密。最后,我们将加密后的结果进行base64编码,并返回加密后的结果。 需要注意的是,CBC模式需要使用随机的IV向量,而PKCS5填充需要在数据长度不足8的倍数时进行填充。另外,密钥长度必须为24字节,即192位。如果密钥长度不足24字节,可以通过在密钥末尾添加空格或其他字符来进行填充,使其长度为24字节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值