php des padding,PHP中的DES/ECB/PKCS5Padding解密

博主正在尝试使用PHP解密通过DES/ECB/PKCS5Padding加密的数据,参照了服务提供商提供的Java解密示例代码。他们遇到了困难,不确定如何正确设置$iv、$keyword和$data。讨论中提到了Java代码可能存在的一些问题,如不应随机生成IV,关键字不应该是有效的密钥,并建议避免使用DES和ECB模式。
摘要由CSDN通过智能技术生成

我需要使用PHP(或Javascript)解密一些服务调用。我一整天都在努力完成这个任务,但我一直无法正确解密。PHP中的DES/ECB/PKCS5Padding解密

作为参考,该服务提供商发送我的Java以下解密示例代码:

DESKeySpec dks = new DESKeySpec("keyword".getBytes());

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey key = keyFactory.generateSecret(dks);

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

SecureRandom sr = new SecureRandom();

cipher.init(Cipher.DECRYPT_MODE, key ,sr);

byte b[] = response.toByteArray();

byte decryptedData[] = cipher.doFinal(b);

我觉得我在正确的道路使用:

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

$iv_size = mcrypt_enc_get_iv_size($td);

$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$key = substr($keyword, 0, mcrypt_enc_get_key_size($td));

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

$decrypted = mdecrypt_generic($td, $data);

$decrypted = pkcs5_unpad($decrypted);

但是,坦率地说,我确定我用$ iv creationg和$ keyword设置(或者用$ data或$ decrypted类型?)搞乱了所有的东西。该pkcs5_unpad功能如下:

function pkcs5_unpad($text)

{

$pad = ord($text{strlen($text)-1});

if ($pad > strlen($text)) return false;

return substr($text, 0, -1 * $pad);

}

我不仅对PHP的一个小白,也是对密码技术......请你帮我解决这个问题呢?

+1

你的提供者是一个白痴,没有别的词。 IV(称为SR)不能随机解密。关键字不是有效的密钥。不应该使用DES,也不应该使用ECB编码。如果不指定字符编码,则不应调用getBytes。而这正是直接刺激我的东西。 –

2012-04-17 19:43:39

+0

可能是的,但是Java Sample应该可以工作(至少他是这么说的)。 “关键字”不是实际的密钥,但其余的代码应该是一个可用的java代码。 –

2012-04-17 20:56:50

+0

嗯,很小的变化,SR不用于IV,但用于密码的任何随机部分(实际上这意味着它根本没有使用)。所以Java代码可能工作。不是说IV会在ECB模式下做出任何改变,但无论如何。 –

2012-04-18 00:01:33

在Vue.js,当你涉及到数据加密,尤其是使用DES(Data Encryption Standard)、ECB(Electronic Codebook,电子密码本模式)和PKCS7Padding(一种填充方案,全称Privacy Enhanced Electronic Mail Cryptography Standards Part 1 Block Cipher Modes of Operation - Padding Method for CBC)时,通常会借助JavaScript的安全库,比如crypto-js。 首先,你需要安装`crypto-js`库,可以使用npm或yarn: ```bash npm install crypto-js # 或者 yarn add crypto-js ``` 然后你可以按照以下步骤解密: 1. **导入库**: ```javascript import CryptoJS from 'crypto-js'; ``` 2. **假设你有加密后的字符串(base64编码),秘钥(key)以及是否使用了PKCS7Padding**: ```javascript const encryptedText = 'your_base64_encoded_text'; const secretKey = 'your_secret_key'; const usePadding = true; // 如果原始数据是按照PKCS7方式填充过的 ``` 3. **解密DES/ECB** (如果没有填充): ```javascript const decrypted = CryptoJS.DES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse(encryptedText), key: CryptoJS.lib.WordArray.create(secretKey) }, { mode: CryptoJS.mode.ECB, padding: usePadding ? CryptoJS.pad.Pkcs7 : undefined }); const plaintext = decrypted.toString(CryptoJS.enc.Utf8); ``` 4. **如果使用PKCS7Padding**: ```javascript // 使用CryptoJS.pad.Pkcs7是因为我们已经知道是用了PKCS7Padding const decrypted = CryptoJS.DES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse(encryptedText), key: CryptoJS.lib.WordArray.create(secretKey) }, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); ``` 5. **最后得到的是未加盐的原始明文**。记得在实际应用处理解密后的安全性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值