php 3des cbc pkcs5,php中實現3DES算法(ECB加密模式PKCS5Padding填充)

講道理,一提到3DES算法,首先想到的是要和java做交互了==

現在3DES已經漸漸被拋棄了,尤其是ECB加密模式使用的更少了,但是沒辦法,業務需要,合作方用的是他,你頭再鐵也不能怎樣,那就扒扒文檔咯

網上完整的php實現以經不多了,CBC加密模式居多,所以我參考了好幾篇文章,整理了一個class出來,共享上來,避免后來人踩坑

感謝前人的整理總結:

PHP版3DES加解密類更新成PKCS5填充模式 (http://blog.163.com/hui_san/blog/static/5710286720103169370195/)

java和php對等的3DES加密算法(http://jamie-wang.iteye.com/blog/1604596)

JAVA和PHP通用的加解密整理版(http://www.blogjava.net/qileilove/archive/2013/09/16/404111.html)

在線測試網址  http://tool.chacuo.net/crypt3des

廢話不多說直接上代碼

<?php /*** Created by PhpStorm.* User: KeenSting* Date: 2017/11/23* Time: 下午2:28* Name: 梁小蒼* Phone: 13126734215* QQ: 707719848* File Description: 3DES_ECB_PKCS5Padding*/classTripleDesEcb{/**加密*@param$text string 文本內容*@param$key string 秘鑰 max 24*@returnstring*/public functionencrypt($text,$key){$iv= mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_ECB),MCRYPT_RAND);$text=$this->pkcs5Pad($text);$td= mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_ECB,'');mcrypt_generic_init($td,$key,$iv);$data= base64_encode(mcrypt_generic($td,$text));mcrypt_generic_deinit($td);mcrypt_module_close($td);print_r($data);return$data;}/**解密*@param$text*@param$key*/public functiondecrypt($text,$key){$iv= mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_ECB),MCRYPT_RAND);$td= mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_ECB,'');mcrypt_generic_init($td,$key,$iv);$data=$this->pkcs5UnPad(mdecrypt_generic($td,base64_decode($text)));mcrypt_generic_deinit($td);mcrypt_module_close($td);print_r($data);}/***@param$text*@returnstring*/private functionpkcs5Pad($text){$pad=8- (strlen($text) %8);return$text. str_repeat(chr($pad),$pad);}/***@param$text*@returnbool|string*/private functionpkcs5UnPad($text){$pad= ord($text{strlen($text)-1});if($pad> strlen($text))return false;if(strspn($text,chr($pad),strlen($text) -$pad) !=$pad)return false;returnsubstr($text,0,-1*$pad);}}//test$a=newTripleDesEcb();$r=$a->encrypt('keensting','AA190CD754A89EF100190CD754A89EF1');$a->decrypt($r,'AA190CD754A89EF100190CD754A89EF1');

測試的加密結果經過base64編碼后為:juyYkxc6B+Ym3p8QQdvXIg==,解密即可得到原文(對稱加密算法的加密和解密用的是同一個類)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,我可以回答这个问题。以下是使用 Python 编写 DES 加密算法的示例代码: ```python from Crypto.Cipher import DES def encrypt(key, plaintext): cipher = DES.new(key, DES.MODE_ECB) padded_plaintext = plaintext + (8 - len(plaintext) % 8) * chr(8 - len(plaintext) % 8) ciphertext = cipher.encrypt(padded_plaintext.encode('utf-8')) return ciphertext.hex() key = b'secret_k' plaintext = 'Hello, world!' ciphertext = encrypt(key, plaintext) print(ciphertext) ``` 其中,`key` 是 8 字节的密钥,`plaintext` 是需要加密的明文。该函数会返回加密后的密文,以十六进制字符串的形式表示。 需要注意的是,DES 加密算法已经被认为不够安全,建议使用更加安全的加密算法,如 AES 等。 ### 回答2: DES(Data Encryption Standard)是一种对称密钥加密算法,可以使用Python编写DES加密算法的实现。 首先,我们需要导入PyCryptodome库,它是Python中常用的密码学库之一。 接下来,我们需要设置密钥和明文。DES算法使用的是64位的密钥,共8个字节。明文也需要是64位,即8个字节。 然后,我们可以使用PyCryptodome库中的DES模块来创建一个DES对象,并传入密钥作为参数。 接着,使用DES对象的encrypt方法来对明文进行加密。通过将明文转换为字节类型,并使用encrypt方法加密,得到密文。 最后,我们可以打印出加密后得到的密文并返回。 下面是一个简单的示例代码: ```python from Cryptodome.Cipher import DES def des_encrypt(key, plaintext): cipher = DES.new(key, DES.MODE_ECB) ciphertext = cipher.encrypt(plaintext.encode()) print("加密后的密文:", ciphertext) return ciphertext key = b'abcdefgh' # 密钥,共8个字节 plaintext = 'Hello1234' # 明文 ciphertext = des_encrypt(key, plaintext) ``` 请注意,示例代码中的密钥和明文都是临时设置的,实际应用中需要根据需求修改。 此外,还可以通过更改DES的工作模式(如ECBCBC等)以及填充模式(如PKCS7、ZeroPadding等)来进一步调整DES加密算法的实现。 ### 回答3: DES(Data Encryption Standard)是一种对称加密算法,可以使用python编写该算法的实现。下面是一个简单的示例代码: ```python from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend def des_encrypt(plaintext, key): # 使用ECB模式,需要注意ECB模式可能会有安全问题 cipher = Cipher(algorithms.TripleDES(key), modes.ECB(), backend=default_backend()) encryptor = cipher.encryptor() cipher_text = encryptor.update(plaintext) + encryptor.finalize() return cipher_text def des_decrypt(ciphertext, key): cipher = Cipher(algorithms.TripleDES(key), modes.ECB(), backend=default_backend()) decryptor = cipher.decryptor() plain_text = decryptor.update(ciphertext) + decryptor.finalize() return plain_text # 测试示例 plaintext = b"Hello World" # 待加密的明文 key = b"0123456789ABCDEF" # 密钥(8字节,或者24字节用于Triple DES) ciphertext = des_encrypt(plaintext, key) # 加密 decrypted_text = des_decrypt(ciphertext, key) # 解密 print("明文:", plaintext) print("密文:", ciphertext) print("解密后明文:", decrypted_text) ``` 以上是用python实现的一个简单的DES加密算法示例。需要注意的是,ECB模式加密多个相同的块时,容易出现安全问题,因此在实际使用中推荐使用更安全的加密模式(如CBC、CTR等)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值