No Description

RSA.swift 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // Data+Encryption.swift
  3. // Function
  4. //
  5. // Created by mac on 2016/11/9.
  6. // Copyright © 2016年 mac. All rights reserved.
  7. //
  8. import UIKit
  9. // MARK: RSA encrypt
  10. extension Data {
  11. fileprivate func rsa_publickey_form_data(keyData: Data) -> SecKey? {
  12. if let certificate = SecCertificateCreateWithData(kCFAllocatorDefault, keyData as CFData) {
  13. let policy = SecPolicyCreateBasicX509()
  14. var trust: SecTrust?
  15. if SecTrustCreateWithCertificates(certificate, policy, &trust) == errSecSuccess {
  16. var trustResultType: SecTrustResultType = SecTrustResultType.invalid
  17. if SecTrustEvaluate(trust!, &trustResultType) == errSecSuccess {
  18. return SecTrustCopyPublicKey(trust!)!
  19. }
  20. }
  21. }
  22. return nil
  23. }
  24. fileprivate func rsa_privatekey_from_data(keyData: Data, withPassword password: String) -> SecKey? {
  25. var privateKey: SecKey? = nil
  26. let options: [String: String] = [kSecImportExportPassphrase as String: password]
  27. var items: CFArray?
  28. if SecPKCS12Import(keyData as CFData, options as CFDictionary, &items) == errSecSuccess {
  29. if CFArrayGetCount(items) > 0 {
  30. let d = unsafeBitCast(CFArrayGetValueAtIndex(items, 0), to: CFDictionary.self)
  31. let k = Unmanaged.passUnretained(kSecImportItemIdentity).toOpaque()
  32. let v = CFDictionaryGetValue(d, k)
  33. let secIdentity = unsafeBitCast(v, to: SecIdentity.self)
  34. if SecIdentityCopyPrivateKey(secIdentity, &privateKey) == errSecSuccess {
  35. return privateKey
  36. }
  37. }
  38. }
  39. return nil
  40. }
  41. fileprivate func RSA(operation: String, key: SecKey) -> Data? {
  42. let key_size = SecKeyGetBlockSize(key)
  43. var encrypt_bytes = [UInt8](repeating: 0, count: key_size)
  44. var output_size = key_size
  45. if operation == "encrypt" {
  46. if SecKeyEncrypt(key, SecPadding.PKCS1,
  47. self.bytes, self.count,
  48. &encrypt_bytes, &output_size) == errSecSuccess {
  49. return Data(bytes: encrypt_bytes, count: output_size)
  50. }
  51. } else {
  52. let stauts = SecKeyDecrypt(key, SecPadding.PKCS1,
  53. self.bytes, self.count,
  54. &encrypt_bytes, &output_size)
  55. if stauts == errSecSuccess {
  56. return Data(bytes: UnsafePointer<UInt8>(encrypt_bytes), count: output_size)
  57. }
  58. }
  59. return nil
  60. }
  61. func RSAEncryptToData(publicKeyPath: String) -> Data {
  62. let publicKey = try? Data(contentsOf: URL(fileURLWithPath: publicKeyPath))
  63. let publickeyData = rsa_publickey_form_data(keyData: publicKey!)
  64. return RSA(operation: "encrypt", key: publickeyData!)!
  65. }
  66. func RSAEncryptToBase64Data(publicKeyPath: String) -> Data {
  67. return RSAEncryptToData(publicKeyPath: publicKeyPath).base64EncodedData()
  68. }
  69. func RSAEncryptToBase64String(publicKeyPath: String) -> String {
  70. return RSAEncryptToData(publicKeyPath: publicKeyPath).base64EncodedString()
  71. }
  72. mutating func RSADecryptFromBase64DataToData(privateKeyPath: String) -> Data {
  73. self = Data.init(base64Encoded: self)!
  74. return RSADecryptToData(privateKeyPath: privateKeyPath)
  75. }
  76. mutating func RSADecryptFromBase64DataToString(privateKeyPath: String) -> String {
  77. self = Data.init(base64Encoded: self)!
  78. return RSADecryptToString(privateKeyPath: privateKeyPath)
  79. }
  80. func RSADecryptToData(privateKeyPath: String) -> Data {
  81. let privateKey = try? Data(contentsOf: URL(fileURLWithPath: privateKeyPath))
  82. let privateKeyData = rsa_privatekey_from_data(keyData: privateKey!, withPassword: "5995267")
  83. return RSA(operation: "decrypt", key: privateKeyData!)!
  84. }
  85. func RSADecryptToString(privateKeyPath: String) -> String {
  86. return String(data: RSADecryptToData(privateKeyPath: privateKeyPath), encoding: String.Encoding.utf8)!
  87. }
  88. }
  89. extension String {
  90. func RSAEncryptToData(publicKeyPath: String) -> Data {
  91. return self.myData.RSAEncryptToData(publicKeyPath: publicKeyPath)
  92. }
  93. func RSAEncryptToBase64Data(publicKeyPath: String) -> Data {
  94. return self.myData.RSAEncryptToBase64Data(publicKeyPath: publicKeyPath)
  95. }
  96. func RSAEncryptToBase64String(publicKeyPath: String) -> String {
  97. return self.myData.RSAEncryptToBase64String(publicKeyPath: publicKeyPath)
  98. }
  99. func RSADecryptFromBase64StringToData(privateKeyPath: String) -> Data {
  100. return (Data(base64Encoded: self)?.RSADecryptToData(privateKeyPath: privateKeyPath))!
  101. }
  102. func RSADecryptFromBase64StringToString(privateKeyPath: String) -> String {
  103. return (Data(base64Encoded: self)?.RSADecryptToString(privateKeyPath: privateKeyPath))!
  104. }
  105. func RSADecryptToData(privateKeyPath: String) -> Data {
  106. return self.myData.RSADecryptToData(privateKeyPath: privateKeyPath)
  107. }
  108. func RSADecryptToString(privateKeyPath: String) -> String {
  109. return self.myData.RSADecryptToString(privateKeyPath: privateKeyPath)
  110. }
  111. }