CryptoSwift + CryptoJS Swift
Мне действительно нужна помощь в расшифровке ответа сервера, зашифрованного CryptoJS.
Я использую CryptoSwift для расшифровки ответа.
Вот пример данных ответа сервера, которые я получаю.
{\"Кт \":\"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 Ха +7ePSJqmUDSRQHXOGUKCnUh/vm425ZpuxIgE4E+KdslAuWTx1u1/WagVywjyj12OeZ84xsXVf0kJs1nCFvnkhb3wEjJrbSRbBvcBkP4zZsMTzcgFrzugqhtZ2LhZFtdUaQYa/tXjAF8DBdq+ HLF+8RPul1riAczQoqDQkonYMH2WA9utWLWTYmPVJODLPEO5mL+yXqX9iCh3YycR8ssJgCkBmeN+yLydUoWLDfIC8NGnlcprpDqXrM0aDTwxADiBG4yWIgAxoZXCQEKIUxK0NuOssW9Z6tCB6yxDPzJdRqeOC2I2ky82YsIrLhPutspqycPAf4B8gbsUBcIqtflYhebiz50T3gk4gNS/2HNShGdzjPhjBvqk+GzETAu9t0JmbWBkuHq07r0lvM8zn474YHvzYIXOBUuZJKpGWPK+fvbEP1qXOTP4EkBSdgU0pcNO/Y7D3g4R26qTWmyWvnFKFAAGjXawwxKqBcdSJZxNkOgg/uekCAhRSwUq9qaeJHU1dl+M9OOwa7iGwlXtUPht0+1FGbN14=\"\"IV \": \"d6d6bd8ee407bc25a7b23d8d36b7bce9 \", \"с \": \"b8e72892c801c87c \"}"}
Простой анализ строки очищает зашифрованную строку и дает мне следующие данные:
let iv = "d6d6bd8ee407bc25a7b23d8d36b7bce9"
let salt = "b8e72892c801c87c"
и ключ исправить с другими данными
let key = "8aa1ec1e6948b481d1ee450c94ffb2edc774877325df4d05aca2e5827497ed33"
Вот код, который я использую для расшифровки ответа:
// transforming key to [UInt8]
let keyChars = Array(key.characters)
let keyBytes = 0.stride(to: keyChars.count, by: 2).map {
UInt8(String(keyChars[$0 ..< $0+2]), radix: 16) ?? 0
}
// transforming iv to [UInt8]
let ivChars = Array(iv.characters)
let ivBytes = 0.stride(to: ivChars.count, by: 2).map {
UInt8(String(ivChars[$0 ..< $0+2]), radix: 16) ?? 0
}
// transforming encryptedData to [UInt8]
let messageData = encrypted.dataFromHexadecimalString()
let byteArray = messageData!.arrayOfBytes()
do {
let decryptedBytes: [UInt8] = try AES(key: keyBytes, iv: ivBytes, blockMode: .CFB).decrypt(byteArray)
let data = NSData.withBytes(decryptedBytes)
let decrypted = data.base64EncodedStringWithOptions([])
let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
print("decrypted = \(json)")
} catch {
print("error = \(error)")
}
Что бы я ни делал, я получаю либо error = Decrypt, либо строку base64, которая не декодируется в JSON, как предполагается.
PS: я попробовал CryptoJS.swift, но результат был "неопределен"
UPD
Пример проекта Вот как данные зашифрованы на бэкэнде:
CryptoJS.AES.encrypt(JSON.stringify(options.params), key, { format: JsonFormatter }).toString()
Вот как данные расшифровываются на бэкэнде:
JSON.parse(CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt(raw, key, { format: JsonFormatter })))
Я пытался сделать что-то похожее в моем примере проекта, но по какой-то причине это не сработало для меня.
UPD2
Обновление с конца
// Nodejs import
var node_cryptojs = require('node-cryptojs-aes');
var CryptoJS = node_cryptojs.CryptoJS;
var JsonFormatter = node_cryptojs.JsonFormatter;
// Data to encrypt and encryption key
var data = {'hello':'world'};
var key = '8aa1ec1e6948b481d1ee450c94ffb2edc774877325df4d05aca2e5827497ed33';
// Encryption of the data
var encrypted = CryptoJS.AES.encry
var decrypted = JSON.parse(CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt(encrypted, key, { format: JsonFormatter })))
UPD3
Нет, название похожее, но API другой. Мы использовали npmjs.com/package/node-cryptojs-aes на стороне сервера (шифрование + дешифрование) и code.google.com/archive/p/crypto-js на стороне клиента на нашем сайте (также шифрование + дешифрование)
Образец зашифрованных данных
{"_Id":"5687ad129b65920a00b56a9b","тип": "пользователь", "создано":"2016-01-02T10:57:22.851Z","UUID":"d9df3412cee97ec1d0a8c547f73e4bb6", "секретно": "307a14f6ffc667c7941e6263edca4149", "профиль":{"фамилия": "Ммм", "пол": "Мужской", "Имя": "Ммм", "электронная почта": "mmm@mmm.mmm", "д.р.": "1993-10- 31T00: 00: 00.000 + 0200 "}," аватар ": {" large ":" https://graph.facebook.com/v2.4/1122734811071660/picture?width=120&height=120"}," location ":{"страна":{"имя_файла": "греция", "код": "GR", "континент": "Европа", "имя": "Греция"}, "состояние":{"ID":"Aitolia kai Akarnania "," country ":" GR "," name ":" Aitolia kai Akarnania "}}," auth ": {" facebook ": {" userID ":" 1122734811071660 "}}," notifications":{" new_window ": {" смс "ложь," электронная почта ": правда," толчок "ложь}," new_live ": {" смс "ложь," электронная почта ": правда," толчок "ложь}," new_premium":{"смс": правда, "электронная почта": правда, "толчок" ложь}, "напоминание":{"смс": правда, "электронная почта": правда, "толчок" ложь}, "new_arcade":{"смс": правда, "электронная почта": правда, "толчок": ложь}, "рейтинг":{"смс" ложь, "электронная почта": правда, "толчок" ложь}}, "METAS": {}, "статистика":{"игра":{"время":{"TOTAL": 108445 2, "лабиринт":{"означают": 180436, "STDEV": 423, "мин": 180013, "Макс": 180859, "сумма": 360872}, "Wordsearch":{"означают": 111639,5" STDEV ": 68379,5," мин ": 43260," макс ": 180019," сумма ": 223279}," мелочи ": {" означают ": 22410," STDEV ": 0," мин ": 22410," макс": 22410, "сумма": 22410}, "brokenword":{"означают": 40399, "STDEV": 0, "мин": 40399, "макс": 40399, "сумма": 40399}, "imagelabel":{"означает": 38349.5, "STDEV": 22808.5, "мин": 15541, "макс": 61158, "сумма": 76699}, "скремблировань":{"означает": 180174, "STDEV": 0," мин ": 180174," макс ": 180174," сумма ": 180174}," как бы ": {" означают ": 180619," STDEV ": 0," мин ": 180619," макс ": 180619," сумма": 180619}}, "оценка":{"всего": 4500, "лабиринт":{"означают": NULL, "STDEV": NULL, "мин": нулевой, "макс": нулевой, "сумма": 0 }, "Wordsearch":{"означает": 1000, "STDEV": 0, "мин": 1000, "макс": 1000, "сумма": 1000}, "мелочь":{"означает": 800," STDEV ": 0," мин ": 800," макс ": 800," сумма ": 800}," brokenword ": {" означают ": 800," STDEV ": 0," мин ": 800," макс": 800, "сумма": 800}, "imagelabel":{"означает": 950, "STDEV": 50, "мин": 900, "макс": 1000, "сумма": 1900}, "скремблировань":{"означают": нулевой, "STDEV": нулевой, "мин": нулевой, "макс": нулевой, "сумма": 0}, "вид":{"означают": нулевой, "STDEV": нулевой," мин ": нулевая, "Макс": NULL, "сумма":0}}},"позиции":{"Position":{"Avg":0}},"играли":{"окно": 1, "всего": 232, "живой": 120, "аркада": 101, "живой дубликат":10}},"кредиты":487,"UTM": "ложный", "перманент":{"корень": истинный}," неопределенными ": нулевой," значение ": {" кредиты ": 520," USD ": 52," купил ":3}," премиум ": правда}