Получение закрытого ключа RSA n и d с помощью Swift - PullRequest
3 голосов
/ 15 июня 2019

Я пытаюсь реализовать алгоритм проблем миллионеров Яо в ​​Swift и попадаюсь в ловушку.

Чтобы реализовать этот алгоритм, мне нужно сгенерировать закрытый ключ RSA и получить n и d.

Пока что я создал ключ следующим образом:

import Security
import Foundation

let tag = "com.example.keys.mykey".data(using: .utf8)!
let attributes: [String: Any] = [kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
    kSecAttrKeySizeInBits as String: 1024,
    kSecPrivateKeyAttrs as String:
        [kSecAttrIsPermanent as String: false,
        kSecAttrApplicationTag as String: tag]
]

var error: Unmanaged<CFError>?
guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
    throw error!.takeRetainedValue() as Error
}

privateKey, похоже, имеет тип SecKey, но я не могу понять, как его получить n и d вне его.

Как мне сгенерировать закрытый ключ RSA и получить значения n и d?

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Благодаря помощи ответа Люка я заставил его работать следующим образом. Я решил использовать пакет BigInt swift.

import BigInt

var error2: Unmanaged<CFError>?
let privateKeyData = SecKeyCopyExternalRepresentation(privateKey!, &error2) as Data?
let privateKeyDataN = privateKeyData![10...10+128]
let privateKeyDataD = privateKeyData![147...147+127]
let n = BigUInt(privateKeyDataN)
let d = BigUInt(privateKeyDataD)
2 голосов
/ 18 июня 2019

Вы ищете функцию SecKeyCopyAttributes.Эта функция, когда передано SecKey, вернет CFDictionary, который содержит ключ v_Data, который содержит закодированную DER последовательность атрибутов, которые описывают ключ:

PrivateKey ::= SEQUENCE {
    version           INTEGER,
    modulus           INTEGER, <- n
    publicExponent    INTEGER,
    privateExponent   INTEGER, <- d
    prime1            INTEGER,
    prime2            INTEGER,
    exponent1         INTEGER,
    exponent2         INTEGER,
    coefficient       INTEGER,
    otherPrimeInfos   OtherPrimeInfos OPTIONAL
 }

Нелюбое означает прямолинейное решение, но Apple никогда не была известна своим прямым шифрованием.

Теперь вы могли бы внедрить парсер ASN.1 или попытаться найти и запустить его.Но, если честно, на вашем месте я бы просто создал ярлык и вытащил только те два значения, которые вам нужны.

Вот фиктивная разбивка аналогичной структуры ASN.1, которая представляет собой последовательностьцелые числа:

enter image description here

и его шестнадцатеричное представление ...

enter image description here

Эти изображения получены с этого превосходного декодера ASN.1 здесь. .Для наглядности выделенная часть шестнадцатеричного числа - это целое число секунда вниз.

Вы можете извлечь нужные значения, пропустив заголовок SEQUENCE и рассчитав длину каждого целого числа.(байт 0x02 буквально означает «INTEGER»).Делая это, вы можете точно определить местоположения в структуре, которые содержат ваш модуль и ваш личный показатель.

Реализация этого я оставлю вам!

...