這是 JavaScript的aesjs進行數(shù)據(jù)加密 代碼
const aesjs = require('aes-js');
const Counter = aesjs.Counter
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
const aesSuffix = '12345678'
const hexPrefix = '22222222'
const hexSuffix = '33333333'
const generateRandomNum = (min, max) => {
if (max === undefined || min === undefined) {
return false
}
const num = Math.floor(Math.random() * (max - min + 1) + min)
return num
}
//對稱加解密code
const generateCode = (len = 8) => {
const maxPos = chars.length
let code = ''
for (let i = 0; i < len; i++) {
const randomNum = generateRandomNum(0, maxPos - 1)
const char = chars.charAt(randomNum)
code += char
}
return code
}
const encrypt = (data, key) => {
const hexData = hexPrefix + Buffer.from(data).toString('hex') + hexSuffix
console.log('hexData == ',hexData)
console.log('key + aesSuffix == ',key + aesSuffix)
const cipher = new aesjs.ModeOfOperation.ctr(Buffer.from(key + aesSuffix), new Counter(5))
const encrypted = cipher.encrypt(Buffer.from(hexData, 'hex'))
return Buffer.from(aesjs.utils.hex.fromBytes(encrypted)).toString('hex')
}
let key = generateCode();
let pass = encrypt('1a',key);
搞了一下午,沒有改成PHP的加密方式
你這個沒寫全啊..
decrypt沒寫,很多定西都沒法去,比如encrypt里頭尾加了東西
encrypt寫了, 但是在加密內(nèi)容頭尾加了料 2222222 就是4個雙引號, 3333333就是4個3
然后key size是要求16/24/32 bytes的,你這上面對key也沒做處理
按照你上面的代碼推斷,大概是下面這樣,你上面的generatecode和generaterandomnum沒用到,就不寫了
<?php
function run($data, $key) {
$aesSuffix = '12345678';
$hexPrefix = '22222222';
$hexSuffix = '33333333';
$algorithm = "aes-256-ctr";
$buffer = bin2hex($data);
$hexData = "{$hexPrefix}{$buffer}{$hexSuffix}";
$key = bin2hex("{$key}{$aesSuffix}");
$iv = "0000000000000005"; // Counter(5);
// Encrypted
$encrypted_data = openssl_encrypt($hexData, $algorithm, $key, OPENSSL_RAW_DATA, $iv);
echo "Encrypted: ".bin2hex($encrypted_data).PHP_EOL;
//Decrypt
$decrypted_data = openssl_decrypt($encrypted_data, $algorithm, $key, OPENSSL_RAW_DATA, $iv);
echo "Decrypted: ".$decrypted_data.PHP_EOL;
$obuffer = ltrim($decrypted_data, $hexPrefix);
$obuffer = rtrim($obuffer, $hexSuffix);
echo $obuffer.PHP_EOL;
echo hex2bin($obuffer);
}
run("you are not here", "b1234567");
generatecode就是隨機從'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'拿8個出來當(dāng)key(默認8個),這個你可以自己實現(xiàn) , 加上aesSuffix的8個字母就是 16bytes, 我看aes-js的文檔,根據(jù)key長度用不同的方式
16位就是用aes-128-ctr. 24是aes-196-ctr, 32是aes-256-ctr. 把我上面的aes-256-ctr改成aes-128-ctr就行
謝謝大佬 今天上午我自己也搞了一個 只是我對 $hexData $iv 進行了 hex2bin 才得到的結(jié)果進行了 兩次 bin2hex 才得到j(luò)s的結(jié)果