javascript - 加密 Node.js 中的文本并从 iOS 应用程序解密

标签 javascript node.js cryptojs

我正在使用当前的解决方案来加密 Node.js 中的文本并从 iOS 应用程序中解密。 https://stackoverflow.com/a/27893935/2977578

Node.js 的加密有效,但 CryptoJS 非常慢。我正在尝试移植此代码以使用内置 crypto module在 Node.js 中以提高速度,但我不是这些功能的专家。是否可以仅使用内置的加密模块来使该代码正常工作?

var password = "...";
var salt = "...";
var iv64 = "...";
var hash = CryptoJS.SHA256(salt);
var key = CryptoJS.PBKDF2(password, hash, { keySize: 256/32, iterations: 1000 });
var iv  = CryptoJS.enc.Base64.parse(iv64);
var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv });
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);

最佳答案

我使用内置的 Node.js 加密模块实现了此加密逻辑,我还使用 crypto-js 函数加密了相同的明文,并对两者进行了解码以确保结果一致:

const CryptoJS = require('crypto-js');
const crypto = require("crypto");

function encrypt_cryptojs(message, password, iv64, salt) {
    var hash = CryptoJS.SHA256(salt);
    var key = CryptoJS.PBKDF2(password, hash, { keySize: 256/32, iterations: 1000 });
    var iv  = CryptoJS.enc.Base64.parse(iv64);
    var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv });
    return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}

// Use built-in crypto module.
function encrypt(message, password, iv64, salt) {
    const iv = Buffer.from(iv64, 'base64');
    const hash = crypto.createHash('sha256').update(salt, 'utf8').digest()
    const key = crypto.pbkdf2Sync(password, hash, 1000, 32, null);

    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
    let encrypted = cipher.update(message, 'utf8', 'base64')
    encrypted += cipher.final('base64');
    return encrypted;
}

function decrypt(messagebase64, password, iv64) {

    const iv = Buffer.from(iv64, 'base64');
    const hash = crypto.createHash('sha256').update(salt, 'utf8').digest()
    const key = crypto.pbkdf2Sync(password, hash, 1000, 32, null);

    const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    let decrypted = decipher.update(messagebase64, 'base64');
    decrypted += decipher.final();
    return decrypted;
}

const plaintext = "If you prick us do we not bleed? If you tickle us do we not laugh";
const salt = "some salt";
const password = crypto.scryptSync("some password", salt, 16).toString("base64");
const iv64 = "XxbSho8OZacvQwXC6S5RQw==";

console.log("Ciphertext (crypto js):", encrypt_cryptojs(plaintext, password, iv64, salt));
console.log("Ciphertext (built-in crypto module):", encrypt(plaintext, password, iv64, salt));
console.log("Decrypted (crypto js):", decrypt(encrypt_cryptojs(plaintext, password, iv64, salt), password, iv64));
console.log("Decrypted (built-in crypto module):", decrypt(encrypt(plaintext, password, iv64, salt), password, iv64));

关于javascript - 加密 Node.js 中的文本并从 iOS 应用程序解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58263305/

相关文章:

javascript - 数据库表未在phonegap中创建

node.js - 如何在 Sails.js 中使用 express-react-views?

node.js - 使用 NPM 和 Gulp 的 Google Material Design 图标字体

javascript - 如何使用 crypto-js 将加密输出的二进制数据保存到文件中?

javascript - Jquery 列生成器插件 : 40 times faster in Windows Firefox. 为什么?

javascript - 处理 Protractor 中的异步警报弹出窗口

Node.JS [nodemon] 内部监视失败 : ENFILE: file table overflow

node.js - 使用 openssl 从加密模块解密文件

javascript - CryptoJS 使用密码加密 AES 但 PHP 解密需要 key

javascript - 最新版本的 jQuery UI selectmenu 中的 `format` 回调