javascript - 在 Node.js 中加密文本并从 iOS 应用程序中解密
问题描述
我正在使用当前的解决方案从 Node.js 加密文本并从 iOS 应用程序解密。 https://stackoverflow.com/a/27893935/2977578
Node.js 的加密有效,但 CryptoJS 非常慢。我正在尝试移植此代码以使用 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));
推荐阅读
- c# - UWP 应用程序的非托管内存分析?
- android - Android Toolbar 将 MenuItem 的图标移动到右侧
- angular - 错误:未找到集合,同时使用 in-memory-web-api(不使用任何实时 api 或 json 数据)
- html - 水平增长的列表,元素间的分隔符,没有前置元素的项目符号,没有垂直对齐。如何?
- python - ValueError:找不到资源“C:\Users\loginname\Desktop\2020\chatbot\.data\data.json”
- javascript - 使用 $.append 时的 jQuery 脚本标签执行顺序
- flutter - 在 Flutter 中如何创建数据库和搜索功能?
- hibernate - Hibernate 5,具有 2 个限制的 where 子句的条件查询
- linux - 在linux中使用berkley数据包过滤器获取接口统计信息?
- javascript - 如何在 tabulator.js 中向嵌套表中添加新行