AES256 Проблема с использованием Swift 5 - PullRequest
1 голос
/ 04 июля 2019

Я использую AES256 алгоритм CBC mode с заполнением pkc7. У меня есть бэкэнд в Node.js. Но получить первые 12 случайных символов.

Вот мой быстрый код:

    func encrypt(data: Data, key: Data, iv: Data) throws -> Data? {

        // Output buffer (with padding)
        let outputLength = data.count + kCCBlockSizeAES128

        var outputBuffer = Array<UInt8>(repeating: 0,
                                        count: outputLength)
        //var outputBuffer: [UInt8] = []
        var numBytesEncrypted = 0
        let status = CCCrypt(CCOperation(kCCEncrypt),
                             CCAlgorithm(kCCAlgorithmAES),
                             CCOptions(kCCOptionPKCS7Padding),
                             Array(key),
                             kCCKeySizeAES256,
                             Array(iv),
                             Array(data),
                             data.count,
                             &outputBuffer,
                             outputLength,
                             &numBytesEncrypted)

        guard status == kCCSuccess else { return nil }

        let outputBytes = iv + outputBuffer.prefix(numBytesEncrypted)

        return Data(bytes: outputBytes)
    }

Как мне обойтись без отступов? Или что делать с бэкэндом?

enter image description here

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Вы можете использовать теги до и после полезных данных, которыми хотите поделиться. Этот тег будет вашим заголовком.

как <tag>string</tag>

Таким образом, если вы зашифруете, вы получите первые 12 случайных байтов

, поэтому вам нужно игнорировать текст, отличный от **<tag>...</tag>**

1 голос
/ 07 июля 2019

Нет ничего плохого в том, что вы опубликовали, возможно, вы просто неправильно указали какой-то параметр между 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, которая выглядит примерно так, как в моем примере выше, у вас все будет хорошо!

...