Шифрование AES с использованием CryptoSwift и CryptoJS - PullRequest
0 голосов
/ 13 октября 2018

Я пытался зашифровать текст, используя CryptoSwift для приложения ios и CryptoJS для веб-приложения, которое необходимо расшифровать на платформе Java.Я мог успешно шифровать в javascript, используя следующий код:

var message = "Hello"
var password = "samplepasswordky"

function encrypt(message, password) {
  var salt = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
  var key = CryptoJS.PBKDF2(pass, salt, {
    keySize: keySize/32,
    iterations: iterations
  });

  var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
  var encrypted = CryptoJS.AES.encrypt(msg, key, {
    iv: iv
  });
  var encryptedMessage = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
  return encryptedMessage;
}

Для того же в CryptoSwift я делаю следующее, но я не смог расшифровать текст на Java.

let salt: [UInt8] = Array("0000000000000000".utf8)
let password: [UInt8] = Array("samplepasswordky".utf8)
let iv: [UInt8] = Array("0000000000000000".utf8)
let derivedKey = try! PKCS5.PBKDF2(password: password, salt: salt , iterations: 100, keyLength: 16, variant: .sha1).calculate()
let encrypted = try! AES(key: derivedKey, blockMode: CBC(iv: iv), padding: .pkcs5).encrypt(input)
print(encrypted.toHexString())

Пожалуйста, помогите мне сделать эту работу.

1 Ответ

0 голосов
/ 13 октября 2018

Эта строка:

var salt = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");

Не совпадает с этой строкой:

let salt: [UInt8] = Array("0000000000000000".utf8)

Кодировка 000000000000000000 в utf8 в шестнадцатеричном виде 30303030303030303030303030303030 (0x30 - UTF-8 кодировка символа "0").

То, что вы хотели использовать здесь, это Array(repeating: UInt8(0), count: 16).

Вы также выводите строку Base64 в JavaScript и шестнадцатеричную строку вSwift, это не одно и то же.

Несвязанный примечание:

Эта реализация работает довольно усердно, чтобы получить немного безопасности.Если ваш пароль статический, вы могли бы сделать намного лучше, используя случайный ключ (то есть 32 абсолютно случайных байта 0-255, а не строку символов).PKBDF2 на самом деле не особо вам здесь выгоден, за исключением замедления системы (не замедления атакующего; только вашего приложения).Добавление случайного IV также значительно улучшило бы эту систему с небольшими затратами.

...