Библиотека алгоритмов криптографии, совместимая с ES6 и TypeScript
Установка:
yarn add crypto-es
В проектах node.js мы рекомендуем использовать модули Ecmascript Insead of CommonJS:
// package.json
{
"type": "module"
}
Тогда вы можете импортировать криптоу:
import CryptoES from 'crypto-es';
const rst = CryptoES.MD5("Message").toString();
Или частично импортируйте функцию для снижения веса упаковки:
import { MD5 } from 'crypto-es/lib/md5.js';
const rst = MD5("Message").toString();
Каждый файл в этой библиотеке имеет свой собственный файл .D.TS теперь, поэтому он доступен для частичного импорта отдельных алгоритмов в проектах TypeScript.
Точно так же, как Cryptojs
MD5
MD5 является широко используемой хэш -функцией. Он использовался в различных приложениях безопасности, а также обычно используется для проверки целостности файлов. Тем не менее, MD5 не является устойчивым к столкновению, и он не подходит для таких приложений, как сертификаты SSL или цифровые подписи, которые зависят от этого свойства.
const hash = CryptoES.MD5("Message");
SHA-1
Функции SHA Hash были разработаны Агентством национальной безопасности (АНБ). SHA-1 является наиболее установленным из существующих функций HASH SHA, и он используется в различных приложениях безопасности и протоколах. Тем не менее, сопротивление столкновения SHA-1 ослабевало, поскольку новые атаки обнаружены или улучшены.
const hash = CryptoES.SHA1("Message");
Ша-2
SHA-256 является одним из четырех вариантов в наборе SHA-2. Он не так широко используется, как SHA-1, хотя, по-видимому, обеспечивает гораздо лучшую безопасность.
const hash = CryptoES.SHA256("Message");
SHA-512 в значительной степени идентичен SHA-256, но работает на 64-битных словах, а не 32.
const hash = CryptoES.SHA512("Message");
Cryptoes также поддерживает SHA-224 и SHA-384, которые в значительной степени являются идентичными, но усеченными версиями SHA-256 и SHA-512 соответственно.
SHA-3
SHA-3 является победителем пятилетнего конкурса, чтобы выбрать новый криптографический алгоритм хеш-хеш, где были оценены 64 конкурирующих дизайна.
Примечание: я допустил ошибку, когда назвал эту реализацию SHA-3. Это должно быть названо keccak [c = 2d]. Каждая из функций SHA-3 основана на экземпляре алгоритма Keccak, который NIST выбрал в качестве победителя конкуренции SHA-3, но эти функции SHA-3 не будут производить хэши, идентичные Keccak.
const hash = CryptoES.SHA3("Message");
SHA-3 можно настроить на выходные хэш-длины одного из 224, 256, 384 или 512 бит. По умолчанию 512 бит.
const hash = CryptoES.SHA3("Message", { outputLength: 512 });
const hash = CryptoES.SHA3("Message", { outputLength: 384 });
const hash = CryptoES.SHA3("Message", { outputLength: 256 });
const hash = CryptoES.SHA3("Message", { outputLength: 224 });
RIPEMD-160
const hash = CryptoES.RIPEMD160("Message");
Хэш -алгоритмы принимают либо строки, либо экземпляры Cryptoes.lib.wordarray. Объект WordArray представляет собой массив 32-разрядных слов. Когда вы передаете строку, она автоматически преобразуется в WordArray, закодированный как UTF-8.
Хэш, который ты вернешь, еще не является строкой. Это объект WordArray. Когда вы используете объект WordArray в контексте строки, он автоматически преобразуется в шестнадцатеричную строку.
const hash = CryptoES.SHA256("Message");
alert(typeof hash); // object
alert(hash); // 2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91
Вы можете преобразовать объект WordArray в другие форматы, явно вызывая метод ToString и пропустив энкодер.
const hash = CryptoES.SHA256("Message");
alert(hash.toString(CryptoES.enc.Base64)); // L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E= alert(hash.toString(CryptoES.enc.Latin1)); // /wf��ûøÕ���ëJqEÊ�Æí�6ä§söܯ¥�+/�
alert(hash.toString(CryptoES.enc.Hex)); // 2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91
const sha256 = CryptoES.algo.SHA256.create();
sha256.update("Message Part 1");
sha256.update("Message Part 2");
sha256.update("Message Part 3");
const hash = sha256.finalize();
Коды аутентификации сообщений с ключами (HMAC)-это механизм аутентификации сообщений с использованием криптографических хэш-функций.
HMAC можно использовать в сочетании с любой итерационной криптографической хеш -функцией.
const hash = CryptoES.HmacMD5("Message", "Secret Passphrase");
const hash = CryptoES.HmacSHA1("Message", "Secret Passphrase");
const hash = CryptoES.HmacSHA256("Message", "Secret Passphrase");
const hash = CryptoES.HmacSHA512("Message", "Secret Passphrase");
const hmac = CryptoES.algo.HMAC.create(CryptoES.algo.SHA256, "Secret Passphrase");
hmac.update("Message Part 1");
hmac.update("Message Part 2");
hmac.update("Message Part 3");
const hash = hmac.finalize();
PBKDF2-это функция получения ключей на основе пароля. Во многих приложениях криптографии безопасность пользователей в конечном итоге зависит от пароля, и, поскольку пароль обычно не может быть использован непосредственно в качестве криптографического ключа, требуется некоторая обработка.
Соль обеспечивает большой набор ключей для любого данного пароля, а количество итерации увеличивает стоимость производства ключей из пароля, что также увеличивает сложность атаки.
const salt = CryptoES.lib.WordArray.random(128/8);
const key128Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 });
const key256Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 });
const key512Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 });
const key512Bits1000Iterations = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });
Аэс
Расширенный стандарт шифрования (AES) представляет собой федеральный стандарт обработки информации США (FIP). Он был выбран после 5-летнего процесса, когда было оценено 15 конкурирующих конструкций.
const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.AES.decrypt(encrypted, "Secret Passphrase");
Cryptoes поддерживает AES-128, AES-192 и AES-256. Он выберет вариант по размеру ключа, который вы проходите. Если вы используете пасфразу, то он будет генерировать 256-битный ключ.
DES, Triple Des
DES является ранее доминирующим алгоритмом шифрования и был опубликован в качестве официального федерального стандарта обработки информации (FIP). DES теперь считается небезопасным из -за небольшого размера ключа.
const encrypted = CryptoES.DES.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.DES.decrypt(encrypted, "Secret Passphrase");
Triple DES применяет DES три раза к каждому блоку, чтобы увеличить размер ключа. Считается, что алгоритм безопасен в этой форме.
const encrypted = CryptoES.TripleDES.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.TripleDES.decrypt(encrypted, "Secret Passphrase");
Кролик
Кролик-это высокопроизводительный шифр и финалист в портфеле Estream. Это один из четырех конструкций, выбранных после 3 1/2-летнего процесса, в котором были оценены 22 конструкции.
const encrypted = CryptoES.Rabbit.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.Rabbit.decrypt(encrypted, "Secret Passphrase");
RC4, RC4DROP
RC4-широко используемый шифр потока. Он используется в популярных протоколах, таких как SSL и WEP. Несмотря на то, что история алгоритма примечательна своей простотой и скоростью, не вдохновляет уверенность в его безопасности.
const encrypted = CryptoES.RC4.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.RC4.decrypt(encrypted, "Secret Passphrase");
Было обнаружено, что первые несколько байтов клавишных-это невзгода и утечка информации о ключе. Мы можем защищаться от этой атаки, отказавшись от начальной части клавиш. Этот модифицированный алгоритм традиционно называется RC4-Drop.
По умолчанию 192 слова (768 байтов) отбрасываются, но вы можете настроить алгоритм, чтобы отбросить любое количество слов.
const encrypted = CryptoES.RC4Drop.encrypt("Message", "Secret Passphrase");
const encrypted = CryptoES.RC4Drop.encrypt("Message", "Secret Passphrase", { drop: 3072/4 });
const decrypted = CryptoES.RC4Drop.decrypt(encrypted, "Secret Passphrase", { drop: 3072/4 });
Выдувка
Blowfish-это шифр с симметричным ключом, разработанный в 1993 году Брюсом Шнейером и включенным во многие люксы шифров и продукты шифрования. Blowfish обеспечивает хорошую скорость шифрования в программном обеспечении, и на сегодняшний день не было обнаружено никакого эффективного криптанализа. Тем не менее, расширенный стандарт шифрования (AES) теперь привлекает больше внимания, и Шнайер рекомендует двойной для современных приложений.
Schneier разработал Blowfish в качестве алгоритма общего назначения, предназначенного в качестве альтернативы стареющему DES и свободным от проблем и ограничений, связанных с другими алгоритмами. В то время, когда был выпущен Blowfish, многие другие проекты были запатентованными, обремененными патентами или были коммерческими или государственными секретами. Шнайер заявил, что «Блюдо непатентован и останется настолько во всех странах. Алгоритм настоящим помещается в общественное достояние и может быть свободно использоваться всеми».
Примечательные особенности дизайна включают в себя зависимые от ключа S-боксы и очень сложный график ключей.
const ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);
const plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);
const key = CryptoES.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
const iv = CryptoES.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
const encrypted = CryptoES.AES.encrypt("Message", key, { iv: iv });
const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase", { mode: CryptoES.mode.CFB, padding: CryptoES.pad.AnsiX923 });
Cryptoes поддерживает следующие режимы:
И Cryptoes поддерживает следующие схемы заполнения:
Для сообщества открытого текста алгоритмы шифра принимают либо строки, либо экземпляры Cryptoes.lib.wordarray.
Для ключа, когда вы передаете строку, она рассматривается как пассивная фраза и используется для получения фактического ключа и IV. Или вы можете передать WordArray, который представляет фактический ключ. Если вы передаете фактический ключ, вы также должны пройти фактический IV.
Для шифрового текста алгоритмы шифра принимают либо строки, либо экземпляры Cryptoes.lib.cipherparams. Объект CipherParams представляет собой набор параметров, таких как IV, соль и сам необработанный шифровой текст. Когда вы передаете строку, она автоматически преобразуется в объект CipherParams в соответствии с настраиваемой стратегией формата.
Основной текст, который вы возвращаетесь после расшифровки, является объектом WordArray. Смотрите вывод Hashers для более подробной информации.
Ciphertext, который вы возвращаетесь после шифрования, еще не является строкой. Это объект CipherParams. Объект CipherParams дает вам доступ ко всем параметрам, используемым во время шифрования. Когда вы используете объект CipherParams в строковом контексте, он автоматически преобразуется в строку в соответствии со стратегией формата. По умолчанию является совместимый с OpenSSL формат.
const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase"); alert(encrypted.key); // 74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223
alert(encrypted.iv); // 7781157e2629b094f0e3dd48c4d786115
alert(encrypted.salt); // 7a25f9132ec6a8b34
alert(encrypted.ciphertext); // 73e54154a15d1beeb509d9e12f1e462a0
alert(encrypted); // U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA=
Вы можете определить свои собственные форматы, чтобы быть совместимым с другими крипто -реализациями. Формат - это объект с двумя методами - строительство и анализ - который преобразует между объектами CipherParams и строками зашифрованного текста.
Вот как вы можете написать форматер JSON:
const JsonFormatter = {
stringify: function (cipherParams) { // create json object with ciphertext
const jsonObj = { ct: cipherParams.ciphertext.toString(CryptoES.enc.Base64) }; // optionally add iv and salt
if (cipherParams.iv) {
jsonObj.iv = cipherParams.iv.toString();
}
if (cipherParams.salt) {
jsonObj.s = cipherParams.salt.toString();
}
// stringify json object
return JSON.stringify(jsonObj);
},
parse: function (jsonStr) { // parse json string
const jsonObj = JSON.parse(jsonStr); // extract ciphertext from json object, and create cipher params object
const cipherParams = CryptoES.lib.CipherParams.create(
{ ciphertext: CryptoES.enc.Base64.parse(jsonObj.ct) },
); // optionally extract iv and salt
if (jsonObj.iv) {
cipherParams.iv = CryptoES.enc.Hex.parse(jsonObj.iv)
}
if (jsonObj.s) {
cipherParams.salt = CryptoES.enc.Hex.parse(jsonObj.s)
}
return cipherParams;
},
};
const encrypted = CryptoES.AES.encrypt(
"Message",
"Secret Passphrase",
{ format: JsonFormatter },
);
alert(encrypted); // {"ct":"tZ4MsEnfbcDOwqau68aOrQ==","iv":"8a8c8fd8fe33743d3638737ea4a00698","s":"ba06373c8f57179c"}
const decrypted = CryptoES.AES.decrypt(
encrypted,
"Secret Passphrase",
{ format: JsonFormatter },
);
alert(decrypted.toString(CryptoES.enc.Utf8)); // Message
const key = CryptoES.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
const iv = CryptoES.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
const aesEncryptor = CryptoES.algo.AES.createEncryptor(key, { iv: iv });
const ciphertextPart1 = aesEncryptor.process("Message Part 1");
const ciphertextPart2 = aesEncryptor.process("Message Part 2");
const ciphertextPart3 = aesEncryptor.process("Message Part 3");
const ciphertextPart4 = aesEncryptor.finalize();
const aesDecryptor = CryptoES.algo.AES.createDecryptor(key, { iv: iv });
const plaintextPart1 = aesDecryptor.process(ciphertextPart1);
const plaintextPart2 = aesDecryptor.process(ciphertextPart2);
const plaintextPart3 = aesDecryptor.process(ciphertextPart3);
const plaintextPart4 = aesDecryptor.process(ciphertextPart4);
const plaintextPart5 = aesDecryptor.finalize();
С OpenSsl
Шифровать с OpenSSL:
openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64
Дешифтируют с криптоу:
const decrypted = CryptoES.AES.decrypt(openSSLEncrypted, "Secret Passphrase");
Cryptoes могут преобразовать из форматов кодирования, таких как Base64, Latin1 или Hex, в объекты WordArray и Vica Versa.
const words = CryptoES.enc.Base64.parse('SGVsbG8sIFdvcmxkIQ==');
const base64 = CryptoES.enc.Base64.stringify(words);
const words = CryptoES.enc.Base64url.parse('SGVsbG8sIFdvcmxkIQ==');
const base64url = CryptoES.enc.Base64.stringify(words);
const words = CryptoES.enc.Latin1.parse('Hello, World!');
const latin1 = CryptoES.enc.Latin1.stringify(words);
const words = CryptoES.enc.Hex.parse('48656c6c6f2c20576f726c6421');
const hex = CryptoES.enc.Hex.stringify(words);
const words = CryptoES.enc.Utf8.parse('?');
const utf8 = CryptoES.enc.Utf8.stringify(words);
const words = CryptoES.enc.Utf16.parse('Hello, World!');
const utf16 = CryptoES.enc.Utf16.stringify(words);
const words = CryptoES.enc.Utf16LE.parse('Hello, World!');
const utf16 = CryptoES.enc.Utf16LE.stringify(words);
Создатель WordArray мог бы сработать на ArrayBuffer или TypedArray, чтобы к ним могли применяться алгоризм крипторов:
const words = CryptoES.lib.WordArray.create(new ArrayBuffer(8));
const rst = CryptoES.AES.encrypt(words, 'Secret Passphrase')
Примечание : ArrayBuffer не может прямо передать алгоризмам, вы должны первым изменить их на WordArray.
При этом файлы шифрования будут проще:
const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function () {
const arrayBuffer = reader.result;
const words = CryptoES.lib.WordArray.create(arrayBuffer);
const rst = CryptoES.AES.encrypt(words, 'Secret Passphrase')
...
};
Изменить журнал
Рефакторирование Cryptojs в современной Ecmascript