Шифрование RSA в Swift: данные зашифрованы, но не расшифровываются успешно ⇐ IOS
Шифрование RSA в Swift: данные зашифрованы, но не расшифровываются успешно
Я внедряю шифрование RSA в свой проект iOS. Для этого я создал вспомогательный класс RSAEncryption, который включает метод generateRSAKeyPair(keySize: Int) для генерации как publicKey, так и publicKey. code>privateKey.
Хотя я могу успешно сгенерировать ключи, используя упомянутый выше метод, я сталкиваюсь с ошибкой при попытке зашифровать данные с помощью publicKey и впоследствии расшифровать их с помощью privateKey.
Ошибка расшифровки данных:" Error Domain=NSOSStatusErrorDomain Code=-50 "RSAdecrypt неправильный ввод (ошибка -27)" UserInfo={numberOfErrorsDeep=0, NDescription=RSAdecrypt неправильный ввод (ошибка -27)} Вот мой код:
enum RSAError: Ошибка { случай base64Error случай stringToDataConversionFailed случай keyGenerationFailed (ошибка: Ошибка?) } класс RSAEncryption { статический пусть общий = RSAEncryption() funcgenerateRSAKeyPair(keySize: Int = 2048, tag: String = "") throws -> (privateKey: SecKey?, publicKey: SecKey?) { Guard let tagData = tag.data(using: .utf8) else { бросить RSAError.stringToDataConversionFailed } пусть isPermanent = ложь пусть атрибуты: [CFString: Any] = [ kSecAttrKeyType: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits: размер ключа, kSecPrivateKeyAttrs: [ kSecAttrIsPermanent: isPermanent, kSecAttrApplicationTag: tagData, kSecAttrKeyType: kSecAttrKeyTypeRSA // Добавьте эту строку ], kSecPublicKeyAttrs: [ kSecAttrIsPermanent: isPermanent, kSecAttrApplicationTag: tagData, kSecAttrKeyType: kSecAttrKeyTypeRSA // Добавьте эту строку ] ] ошибка var: Unmanaged? Guard let privKey = SecKeyCreateRandomKey (атрибуты как CFDictionary, &error), let pubKey = SecKeyCopyPublicKey(privKey) еще { throw RSAError.keyGenerationFailed(ошибка: ошибка?.takeRetainedValue() ?? ноль) } возврат (privateKey: privKey, publicKey: pubKey) } } расширение RSAEncryption { // Шифрование с использованием SecKey func encryptSec (данные: данные, publicKey: SecKey) -> Данные? { ошибка var: Unmanaged? если позволить EncryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionOAEPSHA1, данные как CFData, &error) как данные? { debugPrint("Зашифрованные данные:\n", EncryptedData.base64EncodedString()) вернуть зашифрованные данные как данные } еще { если let error = error?.takeRetainedValue() { debugPrint("Зашифрованные данные:", ошибка) } еще { debugPrint("Неизвестная ошибка шифрования данных") } } вернуть ноль } // Расшифровываем с помощью SecKey func decryptSec (данные: Data, PrivateKey: SecKey) -> Данные? { ошибка var: Unmanaged? если разрешить decryptedData = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA1, данные как CFData, &error) как данные? { let decryptedString = String (данные: decryptedData, кодировка: .utf8) debugPrint("Расшифрованные данные:", decryptedString ?? "Невозможно декодировать как UTF-8") вернуть расшифрованные данные } еще { если let error = error?.takeRetainedValue() { debugPrint("Ошибка расшифровки данных:", ошибка) } еще { debugPrint("Неизвестная ошибка расшифровки данных") } } вернуть ноль } } расширение SecKey { данные функции() -> Данные? { ошибка var: Unmanaged? Guard let keyData = SecKeyCopyExternalRepresentation (self, & error) as Data? еще { пусть ошибка = ошибка!.takeRetainedValue() как ошибка отладкаПечать (ошибка) вернуть ноль } вернуть ключевые данные } func base64String() -> Строка { пусть derKey = self.addHeader() пусть base64 = base64Encode(derKey) вернуть базу 64 } частная функция base64Encode (ключ _: Данные) -> String { ключ возврата .base64EncodedString(параметры: [.endLineWithLineFeed, .endLineWithCarriageReturn, .lineLength76Characters]) .replacingOccurrences(of: "\n", with: "") } частная функция addHeader() -> Данные { результат вар = Данные() Guard let derKey = self.data() else { debugPrint("ОШИБКА: Не удалось создать PEM") вернуть результат } пусть кодированиеLength: Int = encodedOctets(derKey.count + 1).count пусть OID: [UInt8] = [0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00] строитель вар: [UInt8] = [] // ПОСЛЕДОВАТЕЛЬНОСТЬ ASN.1 builder.append(0x30) // Общий размер, состоящий из OID + кодировка битовой строки + фактический ключ пусть размер = OID.count + 2 +codingLength + derKey.count пусть encodedSize = encodedOctets (размер) builder.append(contentsOf: encodedSize) result.append(builder, count: builder.count) result.append(OID, count: OID.count) builder.removeAll(keepingCapacity: false) builder.append(0x03) builder.append(contentsOf: encodedOctets(derKey.count + 1)) builder.append(0x00) result.append(builder, count: builder.count) // Фактические ключевые байты result.append(derKey) вернуть результат } частная функция encodedOctets(_ int: Int) -> [UInt8] { // Короткая форма если int < 128 { вернуть [UInt8(целое)] } // Полная форма пусть я = (int/256) + 1 вар лен = целое число результат var: [UInt8] = [UInt8(i + 0x80)] для _ в 0..> 8 } вернуть результат } } Использование:
Безопасность импорта класс ViewController: UIViewController { переопределить функцию viewDidLoad() { супер.viewDidLoad() пусть rsa = RSAEncryption.shared охранник пусть publicKey = попробую? rsa.generateRSAKeyPair(keySize: 2048).publicKey, пусть PrivateKey = попробовать? rsa.generateRSAKeyPair().privateKey еще { возвращаться } Guard let Encrypted = rsa.encryptSec(data: "Hello World.!!".data(using: .utf8)!, publicKey: publicKey) else { возвращаться } print("Публикация: \n", publicKey.base64String()) print("Priv: \n ", PrivateKey.base64String()) Guard let decrypted = rsa.decryptSec(данные: зашифровано, PrivateKey: PrivateKey) еще { возвращаться } print(String(данные: расшифрованы, кодировка: .utf8)) } } Я пытался зашифровать и расшифровать как локально, так и онлайн, но столкнулся с одной и той же проблемой. Хотя я могу успешно зашифровать данные, процесс расшифровки постоянно терпит неудачу.
https://8gwifi.org/rsafunctions.jsp https://www.devglan.com/online-tools/rs ... decryption
Я внедряю шифрование RSA в свой проект iOS. Для этого я создал вспомогательный класс RSAEncryption, который включает метод generateRSAKeyPair(keySize: Int) для генерации как publicKey, так и publicKey. code>privateKey.
Хотя я могу успешно сгенерировать ключи, используя упомянутый выше метод, я сталкиваюсь с ошибкой при попытке зашифровать данные с помощью publicKey и впоследствии расшифровать их с помощью privateKey.
Ошибка расшифровки данных:" Error Domain=NSOSStatusErrorDomain Code=-50 "RSAdecrypt неправильный ввод (ошибка -27)" UserInfo={numberOfErrorsDeep=0, NDescription=RSAdecrypt неправильный ввод (ошибка -27)} Вот мой код:
enum RSAError: Ошибка { случай base64Error случай stringToDataConversionFailed случай keyGenerationFailed (ошибка: Ошибка?) } класс RSAEncryption { статический пусть общий = RSAEncryption() funcgenerateRSAKeyPair(keySize: Int = 2048, tag: String = "") throws -> (privateKey: SecKey?, publicKey: SecKey?) { Guard let tagData = tag.data(using: .utf8) else { бросить RSAError.stringToDataConversionFailed } пусть isPermanent = ложь пусть атрибуты: [CFString: Any] = [ kSecAttrKeyType: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits: размер ключа, kSecPrivateKeyAttrs: [ kSecAttrIsPermanent: isPermanent, kSecAttrApplicationTag: tagData, kSecAttrKeyType: kSecAttrKeyTypeRSA // Добавьте эту строку ], kSecPublicKeyAttrs: [ kSecAttrIsPermanent: isPermanent, kSecAttrApplicationTag: tagData, kSecAttrKeyType: kSecAttrKeyTypeRSA // Добавьте эту строку ] ] ошибка var: Unmanaged? Guard let privKey = SecKeyCreateRandomKey (атрибуты как CFDictionary, &error), let pubKey = SecKeyCopyPublicKey(privKey) еще { throw RSAError.keyGenerationFailed(ошибка: ошибка?.takeRetainedValue() ?? ноль) } возврат (privateKey: privKey, publicKey: pubKey) } } расширение RSAEncryption { // Шифрование с использованием SecKey func encryptSec (данные: данные, publicKey: SecKey) -> Данные? { ошибка var: Unmanaged? если позволить EncryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionOAEPSHA1, данные как CFData, &error) как данные? { debugPrint("Зашифрованные данные:\n", EncryptedData.base64EncodedString()) вернуть зашифрованные данные как данные } еще { если let error = error?.takeRetainedValue() { debugPrint("Зашифрованные данные:", ошибка) } еще { debugPrint("Неизвестная ошибка шифрования данных") } } вернуть ноль } // Расшифровываем с помощью SecKey func decryptSec (данные: Data, PrivateKey: SecKey) -> Данные? { ошибка var: Unmanaged? если разрешить decryptedData = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA1, данные как CFData, &error) как данные? { let decryptedString = String (данные: decryptedData, кодировка: .utf8) debugPrint("Расшифрованные данные:", decryptedString ?? "Невозможно декодировать как UTF-8") вернуть расшифрованные данные } еще { если let error = error?.takeRetainedValue() { debugPrint("Ошибка расшифровки данных:", ошибка) } еще { debugPrint("Неизвестная ошибка расшифровки данных") } } вернуть ноль } } расширение SecKey { данные функции() -> Данные? { ошибка var: Unmanaged? Guard let keyData = SecKeyCopyExternalRepresentation (self, & error) as Data? еще { пусть ошибка = ошибка!.takeRetainedValue() как ошибка отладкаПечать (ошибка) вернуть ноль } вернуть ключевые данные } func base64String() -> Строка { пусть derKey = self.addHeader() пусть base64 = base64Encode(derKey) вернуть базу 64 } частная функция base64Encode (ключ _: Данные) -> String { ключ возврата .base64EncodedString(параметры: [.endLineWithLineFeed, .endLineWithCarriageReturn, .lineLength76Characters]) .replacingOccurrences(of: "\n", with: "") } частная функция addHeader() -> Данные { результат вар = Данные() Guard let derKey = self.data() else { debugPrint("ОШИБКА: Не удалось создать PEM") вернуть результат } пусть кодированиеLength: Int = encodedOctets(derKey.count + 1).count пусть OID: [UInt8] = [0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00] строитель вар: [UInt8] = [] // ПОСЛЕДОВАТЕЛЬНОСТЬ ASN.1 builder.append(0x30) // Общий размер, состоящий из OID + кодировка битовой строки + фактический ключ пусть размер = OID.count + 2 +codingLength + derKey.count пусть encodedSize = encodedOctets (размер) builder.append(contentsOf: encodedSize) result.append(builder, count: builder.count) result.append(OID, count: OID.count) builder.removeAll(keepingCapacity: false) builder.append(0x03) builder.append(contentsOf: encodedOctets(derKey.count + 1)) builder.append(0x00) result.append(builder, count: builder.count) // Фактические ключевые байты result.append(derKey) вернуть результат } частная функция encodedOctets(_ int: Int) -> [UInt8] { // Короткая форма если int < 128 { вернуть [UInt8(целое)] } // Полная форма пусть я = (int/256) + 1 вар лен = целое число результат var: [UInt8] = [UInt8(i + 0x80)] для _ в 0..> 8 } вернуть результат } } Использование:
Безопасность импорта класс ViewController: UIViewController { переопределить функцию viewDidLoad() { супер.viewDidLoad() пусть rsa = RSAEncryption.shared охранник пусть publicKey = попробую? rsa.generateRSAKeyPair(keySize: 2048).publicKey, пусть PrivateKey = попробовать? rsa.generateRSAKeyPair().privateKey еще { возвращаться } Guard let Encrypted = rsa.encryptSec(data: "Hello World.!!".data(using: .utf8)!, publicKey: publicKey) else { возвращаться } print("Публикация: \n", publicKey.base64String()) print("Priv: \n ", PrivateKey.base64String()) Guard let decrypted = rsa.decryptSec(данные: зашифровано, PrivateKey: PrivateKey) еще { возвращаться } print(String(данные: расшифрованы, кодировка: .utf8)) } } Я пытался зашифровать и расшифровать как локально, так и онлайн, но столкнулся с одной и той же проблемой. Хотя я могу успешно зашифровать данные, процесс расшифровки постоянно терпит неудачу.
https://8gwifi.org/rsafunctions.jsp https://www.devglan.com/online-tools/rs ... decryption
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Шифрование RSA в .Net Framework 4.8 с использованием RSAEncryptionPadding.OaepSHA256
Anonymous » » в форуме C# - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Шифрование RSA в .NET 4.8 с использованием RSAEncryptionPadding.OaepSHA256
Anonymous » » в форуме C# - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Шифрование RSA в .NET 4.8 с использованием RSAEncryptionPadding.OaepSHA256
Anonymous » » в форуме C# - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-