KMVerificationRSA.swift 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. //
  2. // KMVerificationRSA.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/8/9.
  6. //
  7. import Cocoa
  8. import CryptoKit
  9. import Security
  10. import CommonCrypto
  11. import Foundation
  12. @objc class KMVerificationRSA: NSObject {
  13. @objc func active(uniquesn: String, cdkey: String, model: String, os: String, language: String, appversion: String) -> String? {
  14. var dictionary: [String: Any] = [:]
  15. if cdkey.isEmpty {
  16. dictionary = ["subscription": ["app_code":"com.imyfone.pdf"],
  17. "device": ["unique_sn":uniquesn,
  18. "os":os,
  19. "platform":"DMG",
  20. "time_zone":"UTC",
  21. "language":language,
  22. "app_version":appversion]]
  23. } else {
  24. dictionary = ["subscription": ["app_code":"com.imyfone.pdf",
  25. "email":cdkey],
  26. "device": ["unique_sn":uniquesn,
  27. "os":os,
  28. "platform":"DMG",
  29. "time_zone":"UTC",
  30. "language":language,
  31. "app_version":appversion]]
  32. }
  33. if let jsonData = try? JSONSerialization.data(withJSONObject: dictionary, options:[]),
  34. let jsonString = String(data: jsonData, encoding: .utf8) {
  35. print(jsonString)
  36. if let publicKey = loadPublicKey() {
  37. let encryptedData = encrypt(plainText: jsonString, publicKey: publicKey)
  38. print("Encrypted data: \(encryptedData?.base64EncodedString() ?? "nil")")
  39. let encryptedString = encryptedData?.base64EncodedString();
  40. return encryptedString
  41. //Test
  42. // let dataToEncrypt = jsonString.data(using: .utf8)!
  43. //
  44. // if let encryptedDataChunks = encryptDataInChunks(data: dataToEncrypt, publicKey: publicKey) {
  45. // print("Encrypted data chunks:")
  46. // for chunk in encryptedDataChunks {
  47. // print(chunk.base64EncodedString()) // 输出每个加密块
  48. // }
  49. // print("111")
  50. // }
  51. //
  52. //
  53. // let message = jsonString
  54. // if let messageData = message.data(using: .utf8) {
  55. // if let publicKey = loadPublicKey() {
  56. // if let encryptedChunks = encrypt(data: messageData, publicKey: publicKey) {
  57. // let encryptedString = encryptedChunks.map { $0.base64EncodedString() }
  58. // print("Encrypted data: \(encryptedString)")
  59. // return encryptedString.first
  60. // }
  61. // }
  62. // }
  63. }
  64. }
  65. return nil
  66. }
  67. @objc func verify(uniquesn: String, model: String, os: String, language: String, appversion: String) -> String? {
  68. let dictionary: [String: Any] = ["subscription": ["app_code":"com.imyfone.pdf"],
  69. "device": ["unique_sn":uniquesn,
  70. "os":os,
  71. "platform":"DMG",
  72. "time_zone":"UTC",
  73. "language":language,
  74. "app_version":appversion]]
  75. if let jsonData = try? JSONSerialization.data(withJSONObject: dictionary, options:[]),
  76. let jsonString = String(data: jsonData, encoding: .utf8) {
  77. print(jsonString)
  78. if let publicKey = loadPublicKey() {
  79. let encryptedData = encrypt(plainText: jsonString, publicKey: publicKey)
  80. print("Encrypted data: \(encryptedData?.base64EncodedString() ?? "nil")")
  81. let encryptedString = encryptedData?.base64EncodedString();
  82. return encryptedString
  83. }
  84. //Test
  85. let message = jsonString
  86. if let messageData = message.data(using: .utf8) {
  87. if let publicKey = loadPublicKey() {
  88. if let encryptedChunks = encrypt(data: messageData, publicKey: publicKey) {
  89. let encryptedString = encryptedChunks.map { $0.base64EncodedString() }
  90. print("Encrypted data: \(encryptedString)")
  91. return encryptedString.first
  92. }
  93. }
  94. }
  95. }
  96. return nil
  97. }
  98. func encrypt(plainText: String, publicKey: SecKey) -> Data? {
  99. guard let data = plainText.data(using: .utf8) else {
  100. return nil
  101. }
  102. var error: Unmanaged<CFError>?
  103. let encryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionPKCS1, data as CFData, &error)
  104. if let error = error?.takeRetainedValue() {
  105. print("Error encrypting data: \(error)")
  106. return nil
  107. }
  108. return encryptedData as Data?
  109. }
  110. func encrypt(data: Data, publicKey: SecKey) -> [Data]? {
  111. let maxChunkSize = 214 // 对于 RSA-2048,214 是最大加密长度
  112. var chunks = [Data]()
  113. var offset = 0
  114. while offset < data.count {
  115. let chunkSize = min(maxChunkSize, data.count - offset)
  116. let chunk = data.subdata(in: offset..<offset + chunkSize)
  117. if let encryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionPKCS1, chunk as CFData, nil) {
  118. chunks.append(encryptedData as Data)
  119. } else {
  120. return nil // 加密失败
  121. }
  122. offset += chunkSize
  123. }
  124. return chunks
  125. }
  126. func loadPublicKey() -> SecKey? {
  127. let publicKeyString = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqYKtu5pbT3bhbOfZ7XFhw1IEiqGvx/z3YwvcrLvG6I+EBbim/YuDfSTqpcTZSjbMeLz8nCzkAsMakoimzI6XpNQOZN35cDCFkjn0vicpnfla2JPMxREwddblAz7u/EMdx71ElcY+UYfSu1QM0Lepc2QPWw9oaD/cNktH6xE6eogLEH0k8ZYP8YIzTW02og7mNtLVO1ssKQYUCIQ5LkKA7zypQul5upajE51rq49vdCoA98y2zBRTMXGM7tpa2rbXQ9fDMn5heCLVCXCHNXDwBMxNhURm7fEfxZPwq7DUmH8EWKXCKKhu+GP0c/eom50FzMxfN2wpQSgNfyNQ7bBgwIDAQAB"
  128. guard let data = Data(base64Encoded: publicKeyString) else {
  129. return nil
  130. }
  131. let options: [String: Any] = [
  132. kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
  133. kSecAttrKeyClass as String: kSecAttrKeyClassPublic,
  134. kSecAttrKeySizeInBits as String: 4096
  135. ]
  136. var error: Unmanaged<CFError>?
  137. let publicKey = SecKeyCreateWithData(data as CFData, options as CFDictionary, &error)
  138. if let error = error?.takeRetainedValue() {
  139. print("Error loading public key: \(error)")
  140. return nil
  141. }
  142. return publicKey
  143. }
  144. func base64Encode(string: String) -> String? {
  145. // 将字符串转换为 Data
  146. guard let data = string.data(using: .utf8) else {
  147. print("Error converting string to Data.")
  148. return nil
  149. }
  150. // 使用 Data 的 base64EncodedString() 方法进行编码
  151. let base64String = data.base64EncodedString()
  152. return base64String
  153. }
  154. // RSA 分块加密
  155. func encryptDataInChunks(data: Data, publicKey: SecKey) -> [Data]? {
  156. let blockSize = SecKeyGetBlockSize(publicKey) - 11 // PKCS#1 v1.5 填充需要额外字节
  157. var encryptedChunks: [Data] = []
  158. var offset = 0
  159. while offset < data.count {
  160. let size = min(data.count - offset, blockSize) // 计算当前块大小
  161. let chunk = data.subdata(in: offset..<offset+size)
  162. var error: Unmanaged<CFError>?
  163. let encryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionPKCS1, data as CFData, &error)
  164. guard let successData = encryptedData else {
  165. if let error = error?.takeRetainedValue() {
  166. print("Encryption failed: \(error)")
  167. }
  168. return nil
  169. }
  170. encryptedChunks.append(successData as Data)
  171. offset += size
  172. }
  173. return encryptedChunks
  174. }
  175. func encrypt22(data: Data, publicKey: SecKey) -> [Data]? {
  176. let keySizeInBytes = 256 // 对于 RSA-2048,密钥大小为 256 字节
  177. let paddingSize = 11 // PKCS#1 填充大小
  178. let maxChunkSize = keySizeInBytes - paddingSize // 最大可加密数据大小
  179. var chunks = [Data]()
  180. var offset = 0
  181. while offset < data.count {
  182. let chunkSize = min(maxChunkSize, data.count - offset)
  183. let chunk = data.subdata(in: offset..<offset + chunkSize)
  184. var error: Unmanaged<CFError>?
  185. guard let encryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionPKCS1, chunk as CFData, &error) else {
  186. print("Encryption error: \(error!.takeRetainedValue() as Error)")
  187. return nil
  188. }
  189. chunks.append(encryptedData as Data)
  190. offset += chunkSize
  191. }
  192. return chunks
  193. }
  194. }