Нет ничего плохого в том, что вы опубликовали, возможно, вы просто неправильно указали какой-то параметр между Swift и node.js.
Прежде всего, неплохо проверить, что вы можете расшифровать локально, на том же языке, что бы вы ни зашифровали. Использование информации из скриншота, который вы опубликовали (обратите внимание на будущее: также публикуйте все в тексте, набирая данные в кодировке Base 64 со скриншота, гораздо более утомительного, чем копирование и вставка).
В вашем случае в Swift это выглядело бы так:
import UIKit
import CommonCrypto
var key = "zewQjVQMGdoEJK0yHtLcbP3ZlHOKjERG"
// This is the ciphertext with the initialization vector prepended.
let base64String = "w93bonVuqtW22Drj4HtZ3zNtNSt+5OBMapGGHekLCFA="
var data = Data(base64Encoded: base64String)!
// Split out the initialization vector and ciphertext
var iv = data[0..<kCCBlockSizeAES128]
var ciphertext = data[kCCBlockSizeAES128..<data.count]
var outputLength = data.count
var outputBuffer = Array<UInt8>(repeating:0, count: outputLength)
var bytesDecrypted = 0
let status = CCCrypt(CCOperation(kCCDecrypt),
CCAlgorithm(kCCAlgorithmAES),
CCOptions(kCCOptionPKCS7Padding),
Array(key.utf8),
kCCKeySizeAES256,
Array(iv),
Array(ciphertext),
ciphertext.count,
&outputBuffer,
outputLength,
&bytesDecrypted
)
print(String(bytes: outputBuffer.prefix(bytesDecrypted), encoding: .utf8))
// Optional("gmail.com")
Как только вы узнаете, что на одном языке все работает хорошо, попробуйте на другом. Сейчас я не знаю много о node.js, но построчное прохождение через Swift привело бы к следующему:
const crypto = require('crypto')
let keyString = 'zewQjVQMGdoEJK0yHtLcbP3ZlHOKjERG'
let key = Buffer.from(keyString, 'utf8')
let base64String = 'w93bonVuqtW22Drj4HtZ3zNtNSt+5OBMapGGHekLCFA='
let ivPlusCiphertextBuffer = Buffer.from(base64String, 'base64')
// Split out the initialization vector and the ciphertext
let blockSize = 16 // Don't know how to get this in Node.js so hard-code it
let iv = ivPlusCiphertextBuffer.subarray(0, blockSize)
let ciphertext = ivPlusCiphertextBuffer.subarray(blockSize, ivPlusCiphertextBuffer.length)
let decryptor = crypto.createDecipheriv('aes-256-cbc', key, iv)
var plaintext = decryptor.update(ciphertext, 'binary', 'utf8')
plaintext += decryptor.final('utf8')
console.log(plaintext)
// gmail.com
Так что, пока вы выводите свои подпрограммы Swift на вход подпрограммы node.js, которая выглядит примерно так, как в моем примере выше, у вас все будет хорошо!