我正在为服务构建NodeJS客户端,该客户端使用256位块Rijndael CBC和PKCS7填充来加密数据。
我已经看过NodeJS中的Rijndael几个实现,但是似乎没有一个可以提供我想要的组合。
任何建议如何在NodeJS中实现?
答案 0 :(得分:1)
我将在此处发布解决方案,以便日后有人遇到相同问题时找到。
通过结合使用NPM注册表中可用的两个模块<?php
$url='http://myurl.com/';
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL, $url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$html = curl_exec($curl);
;
$pro=array();
preg_match_all("/<td>[0-9]{1,3}(\.[0-9]{3})*.[0-9]+DA<\/td>",$html,$match);
$pro['prix']=$match['0'];
preg_match_all('!<td><a href=".*">\K(.+?(?=<\/a><\/td>))!',$html,$match);
$pro['nom']=$match['0'];
$currencies = array_combine($pro['nom'], array_chunk($pro['prix'], 2));
foreach ($currencies as $currency => list($sell, $buy)) {
$output = ' <td data-th="currency">'.$currency.'</td> <td data-th="sellprice">'.$sell.'</td> <td data-th="buyprice">'.$buy.'</td> ';
}
curl_close($curl);
?>
<table class="rwd-table">
<tr>
<th>Devises</th>
<th>Achat</th>
<th>Vente</th>
</tr>
<?php echo $output ?>
</table>
和rijndael-js
,使用Rijndael 256块大小和PKCS7填充进行加密/解密实际上非常容易。
pkcs7-padding
模块允许您使用各种块大小(128、256和192个块大小)进行加密/解密-但是,它仅支持零填充。不提供PKCS7填充支持。因此,您要么需要依赖另一个模块来进行PKCS7填充,要么自己动手(也不是那么困难)。
rijndael-js
的长度不是块大小的倍数,则只会对纯文本(要加密的数据)进行零填充。为防止数据零填充,必须先填充明文,然后再对其进行加密。在下面的示例中,我为此使用了npm的rijndael-js
模块。
pkcs7-padding
这是加密数据的方式
nmp install rijndael-js pkcs7-padding --save
这是解密数据的方法
const Rijndael = require('rijndael');
const padder = require('pkcs7-padding');
const crypto = require('crypto');
const plainText = Buffer.from('Here is my plain text', 'utf8');
//Pad plaintext before encryption
const padded = padder.pad(plainText, 32); //Use 32 = 256 bits block sizes
const key = crypto.randomBytes(32); //32 bytes key length
const iv = crypto.randomBytes(32); //32 bytes IV
const cipher = new Rijndael(key, 'cbc'); //CBC mode
const encrypted = cipher.encrypt(padded, 256, iv);