RSA / ECB / PKCS1 Padding и AES / CBC / PKCS5Padding Шифрование / дешифрование - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть API для вызова, где я должен зашифровать свои данные, используя заполнение RSA / ECB / PKCS1 и AES / CBC / PKCS5PADDING.

Sample Data: {"KEY":"VALUE"}

Шаг 1:

I have to generate a random number of 16 digit. eg: '1234567890123456'

Шаг 2:

Do RSA/ECB/PKCS1Padding to random number and base64Encode the result. we get "encrypted_key"

Шаг 3:

Concatenate random number & data:
DATA = 1234567890123456{"KEY":"VALUE"}

Шаг 4:

Do AES/CBC/PKCS5Padding on DATA (from Step 3) using random number(1234567890123456) as KEY & Base64Encoded random number as IV. we get "ENCRYPTED_DATA"

Итак, для Шаг 1 Я использую JSEncrypt библиотеку JavaScript.для Шаг 4 Я использую функцию CrytoJS.AES.encrypt().Я уверен, что моя функция JSEncrypt работает нормально, так как клиент может расшифровать ее, но клиент не может расшифровать мои данные.Я чувствую, что совершаю ошибку при использовании CryptoJS.

Может ли кто-нибудь правильно подсказать мне, как использовать библиотеку.

Что я делаю:

KEY =  '1234567890123456'
IV  = MTIzNDU2Nzg5MDEyMzQ1Ng==  (result of btoa('1234567890123456') )
DATA = "1234567890123456{"KEY":"VAL"}"

cryptedData = Crypto.AES.encrypt(DATA, KEY, {iv: IV, mode: CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7})

Мне сказали использовать PKCS5Padding в AES / CBC Encryption (Шаг 4), но кажется, что AES не поддерживает PKCS5Padding, но PKCS7Padding.

Я думаю, что ошибаюсь, когда передаю KEY & IV на CryptoJS.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 11 апреля 2019

Для начала давайте посмотрим, почему вы делаете упражнение.RSA предназначен для кодирования только ограниченного количества данных.Поэтому мы используем «гибридное шифрование», когда данные шифруются с использованием симметричного шифра со случайным ключом, а сам ключ шифруется с использованием RSA

Шифрование работает на двоичных данных, чтобы безопасно передавать двоичные данные, данныезакодирован в печатную форму (в шестнадцатеричном или базовом виде)

Шаг 1. Я должен сгенерировать случайное число из 16 цифр

То, что мы видим, это 16 цифр 0-9,Это не совсем безопасно.Сгенерировав 16 цифр, вы получите ключ 10 ^ 16, который равен примерно 2 ^ 53 (если я ошибся в математике, пожалуйста, прокомментируйте).

Вам нужно сгенерировать 16 случайных байтов (цифры 0-256, что приводит к 2 ^ 128 ключ).Это ваш DEK (ключ шифрования данных).

Вы можете закодировать DEK в печатной форме, в шестнадцатеричном коде он будет иметь 32 символа.

Step.2:

ok,теперь вы получаете зашифрованный encoded_encryption_key

Шаг 3, Шаг 4

И здесь вы должны понимать, что вы делаете.

  • шифровать данные, используяDEK (не закодированное случайное число в двоичной форме), вы получите encrypted_data.Вы можете закодировать результат в encoded_encrypted_data
  • , чтобы объединить зашифрованный ключ и зашифрованные данные.Это.вам решать, будете ли вы кодировать его до или после кодирования.Я предлагаю вам сделать конкатенацию encoded_encryption_key и encoded_encrypted_data с некоторым разделителем, потому что если изменяется длина ключа RSA, тоже изменяется длина encoded_encryption_key Убедитесь, что обсудили с клиентом, какой формат ожидается именно,

Примечания:

  • IV должен быть длиной 16 байт для AES и CryptoJS. Я считаю, что он должен быть закодирован в шестнадцатеричном формате, поэтому использование btoa может оказаться не самой лучшей идеей,Я считаю, что CryptoJS просто обрезает значение до 16 байтов, но формально это не правильно.
    • Шифр ​​CBC нуждается в некоторой проверке целостности, я предлагаю добавить HMAC или сигнатуру к результату (в противном случае кто-то может изменить шифротекст, если вы не сможете обнаружить тампер)

, но похоже, что AES не поддерживает PKCS5Padding, но PKCS7Padding.

Действительно, AES поддерживает Pkcs7.Pkcs5 функционально такой же, но определен в 64 блоках.Это обозначение все еще используется в Java как наследие от шифрования DES.

...